@@ -3301,10 +3301,21 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
3301
3301
current_scope->add_symbol (x_m_name, class_type);
3302
3302
}
3303
3303
} else {
3304
- if ( x.n_bases > 0 ) {
3305
- throw SemanticError (" Inheritance in classes isn't supported yet." ,
3304
+ ASR::symbol_t * parent = nullptr ;
3305
+ if ( x.n_bases > 1 ) {
3306
+ throw SemanticError (" Multiple inheritance in classes isn't supported yet." ,
3306
3307
x.base .base .loc );
3307
3308
}
3309
+ else if (x.n_bases == 1 ) {
3310
+ AST::Name_t* n = nullptr ;
3311
+ if ( AST::is_a<AST::Name_t>(*x.m_bases [0 ]) ) {
3312
+ n = AST::down_cast<AST::Name_t>(x.m_bases [0 ]);
3313
+ } else {
3314
+ throw SemanticError (" Expected a Name here" ,x.base .base .loc );
3315
+ }
3316
+ parent = current_scope->resolve_symbol (n->m_id );
3317
+ LCOMPILERS_ASSERT (ASR::is_a<ASR::Struct_t>(*parent));
3318
+ }
3308
3319
SymbolTable *parent_scope = current_scope;
3309
3320
if ( ASR::symbol_t * sym = current_scope->resolve_symbol (x_m_name) ) {
3310
3321
LCOMPILERS_ASSERT (ASR::is_a<ASR::Struct_t>(*sym));
@@ -3324,6 +3335,15 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
3324
3335
}
3325
3336
} else {
3326
3337
current_scope = al.make_new <SymbolTable>(parent_scope);
3338
+ // if ( parent ) {
3339
+ // ASR::Struct_t* base_st = ASR::down_cast<ASR::Struct_t>(parent);
3340
+ // SymbolTable* base_scope = base_st->m_symtab;
3341
+ // for (auto i : base_scope->scope) {
3342
+ // std::string name = i.first;
3343
+ // ASR::symbol_t* sym = i.second;
3344
+ // current_scope->add_symbol(name,sym);
3345
+ // }
3346
+ // }
3327
3347
Vec<char *> member_names;
3328
3348
Vec<char *> member_fn_names;
3329
3349
Vec<ASR::call_arg_t > member_init;
@@ -3344,7 +3364,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
3344
3364
member_names.p , member_names.size (), member_fn_names.p ,
3345
3365
member_fn_names.size (), class_abi, ASR::accessType::Public,
3346
3366
false , false , member_init.p , member_init.size (),
3347
- nullptr , nullptr ));
3367
+ nullptr , parent ));
3348
3368
parent_scope->add_symbol (x.m_name , class_sym);
3349
3369
visit_ClassMembers (x, member_names, member_fn_names,
3350
3370
struct_dependencies, member_init, false , class_abi, true );
@@ -6239,10 +6259,14 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
6239
6259
for ( size_t i = 0 ; i < der_type->n_members && !member_found; i++ ) {
6240
6260
member_found = std::string (der_type->m_members [i]) == member_name;
6241
6261
}
6242
- if ( !member_found ) {
6262
+ if ( !member_found && !der_type-> m_parent ) {
6243
6263
throw SemanticError (" No member " + member_name +
6244
6264
" found in " + std::string (der_type->m_name ),
6245
6265
loc);
6266
+ } else if ( !member_found && der_type->m_parent ) {
6267
+ ASR::ttype_t * parent_type = ASRUtils::TYPE (ASRUtils::make_StructType_t_util (al, loc,der_type->m_parent ));
6268
+ visit_AttributeUtil (parent_type,attr_char,t,loc);
6269
+ return ;
6246
6270
}
6247
6271
ASR::expr_t *val = ASR::down_cast<ASR::expr_t >(ASR::make_Var_t (al, loc, t));
6248
6272
ASR::symbol_t * member_sym = der_type->m_symtab ->resolve_symbol (member_name);
0 commit comments