@@ -540,15 +540,15 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
540
540
}
541
541
case ASR::ttypeType::String: {
542
542
ASR::String_t *t = ASR::down_cast<ASR::String_t>(return_type);
543
- func_calls.push_back (t->m_len_expr );
543
+ func_calls.push_back (t->m_len );
544
544
fix_exprs_ttype_t (func_calls, args, f);
545
- int64_t a_len = t->m_len ;
546
- if ( func_calls[0 ] ) {
547
- diag::Diagnostics diags;
548
- a_len = ASRUtils::extract_len<SemanticAbort>(func_calls[0 ], loc, diags);
549
- }
550
- return ASRUtils::TYPE (ASR::make_String_t (al, loc, t->m_kind , a_len,
551
- func_calls[ 0 ] , ASR::string_physical_typeType::PointerString));
545
+ ASR:: expr_t * a_len = func_calls[ 0 ] ? func_calls[ 0 ] : t->m_len ;
546
+ /* if( func_calls[0] ) {*/
547
+ /* diag::Diagnostics diags;*/
548
+ /* a_len = ASRUtils::extract_len<SemanticAbort>(func_calls[0], loc, diags);*/
549
+ /* } */
550
+ return ASRUtils::TYPE (ASR::make_String_t (al, loc, t->m_kind ,
551
+ a_len, false , false , ASR::string_physical_typeType::PointerString));
552
552
}
553
553
case ASR::ttypeType::StructType: {
554
554
ASR::StructType_t* struct_t_type = ASR::down_cast<ASR::StructType_t>(return_type);
@@ -889,7 +889,10 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
889
889
type = ASRUtils::TYPE (ASR::make_Complex_t (al, loc, 8 ));
890
890
type = ASRUtils::make_Array_t_util (al, loc, type, dims.p , dims.size (), abi, is_argument);
891
891
} else if (var_annotation == " str" ) {
892
- type = ASRUtils::TYPE (ASR::make_String_t (al, loc, 1 , -2 , nullptr , ASR::string_physical_typeType::PointerString));
892
+ type = ASRUtils::TYPE (ASR::make_String_t (al, loc, 1 ,
893
+ ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, loc, -2 ,
894
+ ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 4 )))),
895
+ false , false , ASR::string_physical_typeType::PointerString));
893
896
type = ASRUtils::make_Array_t_util (al, loc, type, dims.p , dims.size (), abi, is_argument);
894
897
} else if (var_annotation == " bool" || var_annotation == " i1" ) {
895
898
type = ASRUtils::TYPE (ASR::make_Logical_t (al, loc, 4 ));
@@ -1949,7 +1952,7 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
1949
1952
AST::ConstantStr_t *n = AST::down_cast<AST::ConstantStr_t>(&annotation);
1950
1953
ASR::symbol_t *sym = current_scope->resolve_symbol (n->m_value );
1951
1954
if ( sym == nullptr || !ASR::is_a<ASR::Struct_t>(*sym) ) {
1952
- throw SemanticError (" Only StructType implemented for constant "
1955
+ throw SemanticError (" Only StructType implemented for con "
1953
1956
" str annotation" , loc);
1954
1957
}
1955
1958
// TODO: Change the returned type from Class to StructType
@@ -2164,25 +2167,36 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
2164
2167
LCOMPILERS_ASSERT (ASRUtils::extract_n_dims_from_ttype (left_type) == 0 );
2165
2168
right_int = ASR::down_cast<ASR::IntegerConstant_t>(
2166
2169
ASRUtils::expr_value (right))->m_n ;
2167
- dest_len = left_type2->m_len * right_int;
2170
+ int64_t strlen;
2171
+ ASRUtils::extract_value (left_type2->m_len ,strlen);
2172
+ dest_len = strlen * right_int;
2168
2173
if (dest_len < 0 ) dest_len = 0 ;
2174
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
2175
+ loc, dest_len, ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
2169
2176
dest_type = ASR::down_cast<ASR::ttype_t >(
2170
- ASR::make_String_t (al, loc, left_type2->m_kind ,
2171
- dest_len, nullptr , ASR::string_physical_typeType::PointerString));
2177
+ ASR::make_String_t (al, loc, left_type2->m_kind , a_len, false , false
2178
+ , ASR::string_physical_typeType::PointerString));
2172
2179
} else if (left_is_int && ASRUtils::expr_value (left) != nullptr ) {
2173
2180
ASR::String_t *right_type2 = ASR::down_cast<ASR::String_t>(
2174
2181
ASRUtils::type_get_past_array (right_type));
2175
2182
LCOMPILERS_ASSERT (ASRUtils::extract_n_dims_from_ttype (right_type) == 0 );
2176
2183
left_int = ASR::down_cast<ASR::IntegerConstant_t>(
2177
2184
ASRUtils::expr_value (left))->m_n ;
2178
- dest_len = right_type2->m_len * left_int;
2185
+ int64_t strlen;
2186
+ ASRUtils::extract_value (right_type2->m_len ,strlen);
2187
+ dest_len = strlen * left_int;
2179
2188
if (dest_len < 0 ) dest_len = 0 ;
2189
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
2190
+ loc, dest_len, ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
2180
2191
dest_type = ASR::down_cast<ASR::ttype_t >(
2181
- ASR::make_String_t (al, loc, right_type2->m_kind ,
2182
- dest_len, nullptr , ASR::string_physical_typeType::PointerString));
2192
+ ASR::make_String_t (al, loc, right_type2->m_kind , a_len, false , false
2193
+ , ASR::string_physical_typeType::PointerString));
2183
2194
} else {
2195
+
2196
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
2197
+ loc, -1 , ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
2184
2198
dest_type = ASRUtils::TYPE (ASR::make_String_t (al,
2185
- loc, 1 , - 1 , nullptr , ASR::string_physical_typeType::PointerString));
2199
+ loc, 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
2186
2200
}
2187
2201
2188
2202
if (ASRUtils::expr_value (left) != nullptr && ASRUtils::expr_value (right) != nullptr ) {
@@ -2216,9 +2230,14 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
2216
2230
ASRUtils::type_get_past_array (right_type));
2217
2231
LCOMPILERS_ASSERT (ASRUtils::extract_n_dims_from_ttype (left_type) == 0 );
2218
2232
LCOMPILERS_ASSERT (ASRUtils::extract_n_dims_from_ttype (right_type) == 0 );
2233
+ int64_t left_len, right_len;
2234
+ ASRUtils::extract_value (left_type2->m_len , left_len);
2235
+ ASRUtils::extract_value (right_type2->m_len , right_len);
2236
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, loc, left_len+right_len,
2237
+ ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
2219
2238
dest_type = ASR::down_cast<ASR::ttype_t >(
2220
2239
ASR::make_String_t (al, loc, left_type2->m_kind ,
2221
- left_type2-> m_len + right_type2-> m_len , nullptr ,
2240
+ a_len, false , false ,
2222
2241
ASR::string_physical_typeType::PointerString));
2223
2242
if (ASRUtils::expr_value (left) != nullptr && ASRUtils::expr_value (right) != nullptr ) {
2224
2243
char * left_value = ASR::down_cast<ASR::StringConstant_t>(
@@ -2228,7 +2247,9 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
2228
2247
char * result;
2229
2248
std::string result_s = std::string (left_value) + std::string (right_value);
2230
2249
result = s2c (al, result_s);
2231
- LCOMPILERS_ASSERT ((int64_t )strlen (result) == ASR::down_cast<ASR::String_t>(dest_type)->m_len )
2250
+ int64_t dest_len;
2251
+ ASRUtils::extract_value (ASR::down_cast<ASR::String_t>(dest_type)->m_len , dest_len);
2252
+ LCOMPILERS_ASSERT ((int64_t )strlen (result) == dest_len)
2232
2253
value = ASR::down_cast<ASR::expr_t >(ASR::make_StringConstant_t (
2233
2254
al, loc, result, dest_type));
2234
2255
}
@@ -3422,9 +3443,10 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
3422
3443
void add_name (const Location &loc) {
3423
3444
std::string var_name = " __name__" ;
3424
3445
std::string var_value = module_name;
3425
- size_t s_size = var_value.size ();
3446
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, loc, var_value.size (),
3447
+ ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
3426
3448
ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
3427
- 1 , s_size, nullptr , ASR::string_physical_typeType::PointerString));
3449
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
3428
3450
ASR::expr_t *value = ASRUtils::EXPR (ASR::make_StringConstant_t (al,
3429
3451
loc, s2c (al, var_value), type));
3430
3452
ASR::expr_t *init_expr = value;
@@ -3450,9 +3472,10 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
3450
3472
void add_lpython_version (const Location &loc) {
3451
3473
std::string var_name = " __LPYTHON_VERSION__" ;
3452
3474
std::string var_value = LFORTRAN_VERSION;
3453
- size_t s_size = var_value.size ();
3475
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, loc, var_value.size (),
3476
+ ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
3454
3477
ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
3455
- 1 , s_size, nullptr , ASR::string_physical_typeType::PointerString));
3478
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
3456
3479
ASR::expr_t *value = ASRUtils::EXPR (ASR::make_StringConstant_t (al,
3457
3480
loc, s2c (al, var_value), type));
3458
3481
ASR::expr_t *init_expr = value;
@@ -3565,9 +3588,10 @@ class CommonVisitor : public AST::BaseVisitor<StructType> {
3565
3588
3566
3589
void visit_ConstantStr (const AST::ConstantStr_t &x) {
3567
3590
char *s = x.m_value ;
3568
- size_t s_size = std::string (s).size ();
3591
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, x.base .base .loc , std::string (s).size (),
3592
+ ASRUtils::TYPE (ASR::make_Integer_t (al, x.base .base .loc , 8 ))));
3569
3593
ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_String_t (al, x.base .base .loc ,
3570
- 1 , s_size, nullptr , ASR::string_physical_typeType::PointerString));
3594
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
3571
3595
tmp = ASR::make_StringConstant_t (al, x.base .base .loc , s, type);
3572
3596
}
3573
3597
@@ -6251,8 +6275,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
6251
6275
ASR::Enum_t* enum_type = ASR::down_cast<ASR::Enum_t>(enum_->m_enum_type );
6252
6276
tmp = ASR::make_EnumValue_t (al, loc, e, type, enum_type->m_type , nullptr );
6253
6277
} else if ( std::string (attr_char) == " name" ) {
6278
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, loc, -2 ,
6279
+ ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
6254
6280
ASR::ttype_t * char_type = ASRUtils::TYPE (ASR::make_String_t (
6255
- al, loc, 1 , - 2 , nullptr , ASR::string_physical_typeType::PointerString));
6281
+ al, loc, 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
6256
6282
tmp = ASR::make_EnumName_t (al, loc, e, type, char_type, nullptr );
6257
6283
}
6258
6284
} else if (ASR::is_a<ASR::UnionType_t>(*type)) {
@@ -6457,8 +6483,11 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
6457
6483
if ( attr_name == " value" ) {
6458
6484
tmp = ASR::make_EnumValue_t (al, loc, t_mem, type, enum_type->m_type , nullptr );
6459
6485
} else if ( attr_name == " name" ) {
6486
+
6487
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
6488
+ loc, -2 , ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
6460
6489
ASR::ttype_t * char_type = ASRUtils::TYPE (ASR::make_String_t (
6461
- al, loc, 1 , - 2 , nullptr , ASR::string_physical_typeType::PointerString));
6490
+ al, loc, 1 , a_len, true , true , ASR::string_physical_typeType::PointerString));
6462
6491
tmp = ASR::make_EnumName_t (al, loc, t_mem, type, char_type, nullptr );
6463
6492
}
6464
6493
} else if (ASR::is_a<ASR::UnionType_t>(*type)) {
@@ -6594,9 +6623,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
6594
6623
ASR::EnumStaticMember_t* enum_Var = ASR::down_cast<ASR::EnumStaticMember_t>(enum_ref->m_v );
6595
6624
ASR::Variable_t* enum_m_var = ASR::down_cast<ASR::Variable_t>(enum_Var->m_m );
6596
6625
char *s = enum_m_var->m_name ;
6597
- size_t s_size = std::string (s).size ();
6626
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, x.base .base .loc ,
6627
+ std::string (s).size (), ASRUtils::TYPE (ASR::make_Integer_t (al, x.base .base .loc , 8 ))));
6598
6628
enum_ref_type = ASRUtils::TYPE (ASR::make_String_t (
6599
- al, x.base .base .loc , 1 , s_size, nullptr ,
6629
+ al, x.base .base .loc , 1 , a_len, false , false ,
6600
6630
ASR::string_physical_typeType::PointerString));
6601
6631
enum_ref_value = ASRUtils::EXPR (ASR::make_StringConstant_t (al, x.base .base .loc ,
6602
6632
s, enum_ref_type));
@@ -7706,8 +7736,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
7706
7736
args.reserve (al, 1 );
7707
7737
ASR::call_arg_t str_arg;
7708
7738
str_arg.loc = loc;
7739
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
7740
+ loc, s_var.size (), ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
7709
7741
ASR::ttype_t *str_type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
7710
- 1 , s_var. size (), nullptr , ASR::string_physical_typeType::PointerString));
7742
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
7711
7743
str_arg.m_value = ASRUtils::EXPR (
7712
7744
ASR::make_StringConstant_t (al, loc, s2c (al, s_var), str_type));
7713
7745
ASR::call_arg_t sub_arg;
@@ -7741,8 +7773,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
7741
7773
args.reserve (al, 1 );
7742
7774
ASR::call_arg_t str_arg;
7743
7775
str_arg.loc = loc;
7776
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
7777
+ loc, s_var.size (), ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
7744
7778
ASR::ttype_t *str_type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
7745
- 1 , s_var. size (), nullptr , ASR::string_physical_typeType::PointerString));
7779
+ 1 , a_len, true , true , ASR::string_physical_typeType::PointerString));
7746
7780
str_arg.m_value = ASRUtils::EXPR (
7747
7781
ASR::make_StringConstant_t (al, loc, s2c (al, s_var), str_type));
7748
7782
ASR::call_arg_t sub_arg;
@@ -7828,8 +7862,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
7828
7862
args.reserve (al, 1 );
7829
7863
ASR::call_arg_t str_arg;
7830
7864
str_arg.loc = loc;
7865
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
7866
+ loc, s_var.size (), ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
7831
7867
ASR::ttype_t *str_type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
7832
- 1 , s_var. size (), nullptr , ASR::string_physical_typeType::PointerString));
7868
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
7833
7869
str_arg.m_value = ASRUtils::EXPR (
7834
7870
ASR::make_StringConstant_t (al, loc, s2c (al, s_var), str_type));
7835
7871
ASR::call_arg_t sub_arg;
@@ -7884,8 +7920,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
7884
7920
args.reserve (al, 1 );
7885
7921
ASR::call_arg_t str_arg;
7886
7922
str_arg.loc = loc;
7923
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
7924
+ loc, s_var.size (), ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
7887
7925
ASR::ttype_t *str_type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
7888
- 1 , s_var. size (), nullptr , ASR::string_physical_typeType::PointerString));
7926
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
7889
7927
str_arg.m_value = ASRUtils::EXPR (
7890
7928
ASR::make_StringConstant_t (al, loc, s2c (al, s_var), str_type));
7891
7929
ASR::call_arg_t sub_arg;
@@ -7911,8 +7949,10 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
7911
7949
throw SemanticError (" String to undergo partition cannot be empty" ,
7912
7950
loc);
7913
7951
}
7952
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
7953
+ loc, s_var.size (), ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
7914
7954
ASR::ttype_t *char_type = ASRUtils::TYPE (ASR::make_String_t (al,
7915
- loc, 1 , s_var. size (), nullptr , ASR::string_physical_typeType::PointerString));
7955
+ loc, 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
7916
7956
ASR::expr_t *str = ASRUtils::EXPR (ASR::make_StringConstant_t (al,
7917
7957
loc, s2c (al, s_var), char_type));
7918
7958
tmp = ASRUtils::Partition::create_partition (al, loc, args_, str, diag);
@@ -8115,8 +8155,10 @@ we will have to use something else.
8115
8155
throw SemanticError (" 'str' object has no attribute '" + attr_name + " '" ,
8116
8156
loc);
8117
8157
}
8158
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al,
8159
+ loc, s_var.size (), ASRUtils::TYPE (ASR::make_Integer_t (al, loc, 8 ))));
8118
8160
ASR::ttype_t *str_type = ASRUtils::TYPE (ASR::make_String_t (al, loc,
8119
- 1 , s_var. size (), nullptr , ASR::string_physical_typeType::PointerString));
8161
+ 1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
8120
8162
tmp = ASR::make_StringConstant_t (al, loc, s2c (al, s_var), str_type);
8121
8163
}
8122
8164
@@ -8547,8 +8589,10 @@ we will have to use something else.
8547
8589
}
8548
8590
}
8549
8591
}
8592
+ ASR::expr_t * a_len = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, x.base .base .loc ,
8593
+ 0 , ASRUtils::TYPE (ASR::make_Integer_t (al, x.base .base .loc , 8 ))));
8550
8594
ASR::ttype_t *type = ASRUtils::TYPE (ASR::make_String_t (
8551
- al, x.base .base .loc , -1 , 0 , nullptr , ASR::string_physical_typeType::PointerString));
8595
+ al, x.base .base .loc , -1 , a_len, false , false , ASR::string_physical_typeType::PointerString));
8552
8596
ASR::expr_t * string_format = ASRUtils::EXPR (ASRUtils::make_StringFormat_t_util (al, x.base .base .loc ,
8553
8597
nullptr , args_expr.p , args_expr.size (), ASR::string_format_kindType::FormatPythonFormat,
8554
8598
type, nullptr ));
0 commit comments