Changeset b0d9ff7 for src/Validate
- Timestamp:
- Sep 1, 2022, 1:27:52 PM (2 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- 12df6fe
- Parents:
- def751f
- Location:
- src/Validate
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Validate/FixQualifiedTypes.cpp
rdef751f rb0d9ff7 19 19 #include "AST/TranslationUnit.hpp" 20 20 #include "Validate/NoIdSymbolTable.hpp" 21 #include "SymTab/Mangler.h" // for Mangler 22 #include "AST/LinkageSpec.hpp" // for Linkage 21 23 22 24 namespace Validate { … … 89 91 } 90 92 } 93 94 ast::Expr const * postvisit( ast::QualifiedNameExpr const * t) { 95 assert( location ); 96 if ( t->type_decl ) { 97 auto enumName = t->type_decl->name; 98 const ast::EnumDecl * enumDecl = symtab.lookupEnum( enumName ); 99 for ( ast::ptr<ast::Decl> const & member : enumDecl->members ) { 100 if ( auto memberAsObj = member.as<ast::ObjectDecl>() ) { 101 if ( memberAsObj->name == t->name ) { 102 return new ast::VariableExpr( t->location, memberAsObj ); 103 } 104 } else { 105 assertf( false, "unhandled qualified child type"); 106 } 107 } 108 109 110 auto var = new ast::ObjectDecl( t->var->location, t->name, 111 new ast::EnumInstType(enumDecl, ast::CV::Const), nullptr, {}, ast::Linkage::Cforall ); 112 var->scopeLevel = 1; // 1 for now; should copy the scopeLevel of the enumValue 113 var->mangleName = Mangle::mangle( var ); 114 return new ast::VariableExpr( t->location, var ); 115 // return ret; 116 } 117 118 return t; 119 } 120 91 121 }; 92 122 -
src/Validate/LinkReferenceToTypes.cpp
rdef751f rb0d9ff7 46 46 void postvisit( ast::UnionDecl const * decl ); 47 47 ast::TraitDecl const * postvisit( ast::TraitDecl const * decl ); 48 ast::QualifiedNameExpr const * previsit( ast::QualifiedNameExpr const * decl); 48 49 49 50 private: … … 292 293 } 293 294 295 ast::QualifiedNameExpr const * LinkTypesCore::previsit( ast::QualifiedNameExpr const * decl ) { 296 // Try to lookup type 297 if ( auto objDecl = decl->type_decl.as<ast::ObjectDecl>() ) { 298 if ( auto inst = objDecl->type.as<ast::TypeInstType>()) { 299 if ( auto enumDecl = symtab.lookupEnum ( inst->name ) ) { 300 auto mut = ast::mutate( decl ); 301 mut->type_decl = enumDecl; 302 auto enumInst = new ast::EnumInstType( enumDecl ); 303 enumInst->name = decl->name; 304 // Adding result; addCandidate() use result 305 mut->result = enumInst; 306 decl = mut; 307 } 308 } 309 } else if ( auto enumDecl = decl->type_decl.as<ast::EnumDecl>() ) { 310 auto mut = ast::mutate( decl ); 311 auto enumInst = new ast::EnumInstType( enumDecl ); 312 enumInst->name = decl->name; 313 // Adding result; addCandidate() use result 314 mut->result = enumInst; 315 decl = mut; 316 } 317 // ast::EnumDecl const * decl = symtab.lookupEnum( type->name ); 318 // // It's not a semantic error if the enum is not found, just an implicit forward declaration. 319 // if ( decl ) { 320 // // Just linking in the node. 321 // auto mut = ast::mutate( type ); 322 // mut->base = const_cast<ast::EnumDecl *>( decl ); 323 // type = mut; 324 // } 325 return decl; 326 } 327 294 328 } // namespace 295 329 -
src/Validate/ReplaceTypedef.cpp
rdef751f rb0d9ff7 183 183 } else if ( auto enumType = dynamic_cast<ast::EnumInstType const *>( designatorType ) ) { 184 184 declsToAddBefore.push_back( new ast::EnumDecl( 185 decl->location, enumType->name, {}, decl->linkage,185 decl->location, enumType->name, false, {}, decl->linkage, 186 186 ( (enumType->base) ? enumType->base->base : nullptr ) 187 187 ) );
Note: See TracChangeset
for help on using the changeset viewer.