Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r954c954 r98538288  
    960960        }
    961961
    962         static bool isNonParameterAttribute( Attribute * attr ) {
    963                 static const std::vector<std::string> bad_names = {
    964                         "aligned", "__aligned__",
    965                 };
    966                 for ( auto name : bad_names ) {
    967                         if ( name == attr->name ) {
    968                                 return true;
    969                         }
    970                 }
    971                 return false;
    972         }
    973 
    974962        Type * ReplaceTypedef::postmutate( TypeInstType * typeInst ) {
    975963                // instances of typedef types will come here. If it is an instance
     
    980968                        ret->location = typeInst->location;
    981969                        ret->get_qualifiers() |= typeInst->get_qualifiers();
    982                         // GCC ignores certain attributes if they arrive by typedef, this mimics that.
    983                         if ( inFunctionType ) {
    984                                 ret->attributes.remove_if( isNonParameterAttribute );
    985                         }
    986                         ret->attributes.splice( ret->attributes.end(), typeInst->attributes );
     970                        // attributes are not carried over from typedef to function parameters/return values
     971                        if ( ! inFunctionType ) {
     972                                ret->attributes.splice( ret->attributes.end(), typeInst->attributes );
     973                        } else {
     974                                deleteAll( ret->attributes );
     975                                ret->attributes.clear();
     976                        }
    987977                        // place instance parameters on the typedef'd type
    988978                        if ( ! typeInst->parameters.empty() ) {
     
    13841374        /// Replaces enum types by int, and function/array types in function parameter and return
    13851375        /// lists by appropriate pointers
    1386         /*
    13871376        struct EnumAndPointerDecay_new {
    13881377                const ast::EnumDecl * previsit( const ast::EnumDecl * enumDecl ) {
     
    14351424                }
    14361425        };
    1437         */
    14381426
    14391427        /// expand assertions from a trait instance, performing appropriate type variable substitutions
     
    15201508                }
    15211509
    1522                 void checkGenericParameters( const ast::BaseInstType * inst ) {
     1510                void checkGenericParameters( const ast::ReferenceToType * inst ) {
    15231511                        for ( const ast::Expr * param : inst->params ) {
    15241512                                if ( ! dynamic_cast< const ast::TypeExpr * >( param ) ) {
     
    18391827const ast::Type * validateType(
    18401828                const CodeLocation & loc, const ast::Type * type, const ast::SymbolTable & symtab ) {
    1841         // ast::Pass< EnumAndPointerDecay_new > epc;
     1829        ast::Pass< EnumAndPointerDecay_new > epc;
    18421830        ast::Pass< LinkReferenceToTypes_new > lrt{ loc, symtab };
    18431831        ast::Pass< ForallPointerDecay_new > fpd{ loc };
    18441832
    1845         return type->accept( lrt )->accept( fpd );
     1833        return type->accept( epc )->accept( lrt )->accept( fpd );
    18461834}
    18471835
Note: See TracChangeset for help on using the changeset viewer.