Ignore:
Timestamp:
Oct 7, 2020, 4:31:43 PM (5 years ago)
Author:
Colby Alexander Parsons <caparsons@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
848439f
Parents:
ae2c27a (diff), 597c5d18 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc into master

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    rae2c27a rc76bd34  
    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
    962974        Type * ReplaceTypedef::postmutate( TypeInstType * typeInst ) {
    963975                // instances of typedef types will come here. If it is an instance
     
    968980                        ret->location = typeInst->location;
    969981                        ret->get_qualifiers() |= typeInst->get_qualifiers();
    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                         }
     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 );
    977987                        // place instance parameters on the typedef'd type
    978988                        if ( ! typeInst->parameters.empty() ) {
     
    13741384        /// Replaces enum types by int, and function/array types in function parameter and return
    13751385        /// lists by appropriate pointers
     1386        /*
    13761387        struct EnumAndPointerDecay_new {
    13771388                const ast::EnumDecl * previsit( const ast::EnumDecl * enumDecl ) {
     
    14241435                }
    14251436        };
     1437        */
    14261438
    14271439        /// expand assertions from a trait instance, performing appropriate type variable substitutions
     
    15081520                }
    15091521
    1510                 void checkGenericParameters( const ast::ReferenceToType * inst ) {
     1522                void checkGenericParameters( const ast::BaseInstType * inst ) {
    15111523                        for ( const ast::Expr * param : inst->params ) {
    15121524                                if ( ! dynamic_cast< const ast::TypeExpr * >( param ) ) {
     
    18271839const ast::Type * validateType(
    18281840                const CodeLocation & loc, const ast::Type * type, const ast::SymbolTable & symtab ) {
    1829         ast::Pass< EnumAndPointerDecay_new > epc;
     1841        // ast::Pass< EnumAndPointerDecay_new > epc;
    18301842        ast::Pass< LinkReferenceToTypes_new > lrt{ loc, symtab };
    18311843        ast::Pass< ForallPointerDecay_new > fpd{ loc };
    18321844
    1833         return type->accept( epc )->accept( lrt )->accept( fpd );
     1845        return type->accept( lrt )->accept( fpd );
    18341846}
    18351847
Note: See TracChangeset for help on using the changeset viewer.