Changeset b262cb3


Ignore:
Timestamp:
Jan 11, 2024, 8:46:37 AM (11 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
8655363
Parents:
cfbc56ec
Message:

Unified and fixed handling of parameter attributes.

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Attribute.cpp

    rcfbc56ec rb262cb3  
    3838
    3939bool Attribute::isValidOnFuncParam() const {
    40         // attributes such as aligned, cleanup, etc. produce GCC errors when they appear
    41         // on function parameters. Maintain here a whitelist of attribute names that are
    42         // allowed to appear on parameters.
     40        // Attributes produce GCC errors when they appear on function
     41        // parameters. This is an allow-list, switching to a forbid-list would
     42        // have to at least mention:
     43        // aligned
    4344        std::string norm = normalizedName();
    44         return norm == "unused" || norm == "noreturn";
     45        return norm == "unused" || norm == "noreturn" || norm == "vector_size";
    4546}
    4647
  • src/Validate/Autogen.cpp

    rcfbc56ec rb262cb3  
    440440
    441441                auto * paramType = ast::deepCopy( member->get_type() );
    442                 paramType->attributes.clear();
     442                erase_if( paramType->attributes, []( ast::Attribute const * attr ){
     443                        return !attr->isValidOnFuncParam();
     444                } );
    443445                ast::ObjectDecl * param = new ast::ObjectDecl(
    444446                        getLocation(), member->name, paramType );
  • src/Validate/ReplaceTypedef.cpp

    rcfbc56ec rb262cb3  
    2525
    2626namespace {
    27 
    28 bool isNonParameterAttribute( ast::Attribute const * attr ) {
    29         static const std::vector<std::string> bad_names = {
    30                 "aligned", "__aligned__",
    31         };
    32         for ( auto name : bad_names ) {
    33                 if ( name == attr->name ) {
    34                         return true;
    35                 }
    36         }
    37         return false;
    38 }
    3927
    4028struct ReplaceTypedefCore final :
     
    10189                // by typedef. GCC appears to do the same thing.
    10290                if ( isAtFunctionTop ) {
    103                         erase_if( ret->attributes, isNonParameterAttribute );
     91                        erase_if( ret->attributes, []( ast::Attribute const * attr ){
     92                                return !attr->isValidOnFuncParam();
     93                        } );
    10494                }
    10595                for ( const auto & attribute : type->attributes ) {
Note: See TracChangeset for help on using the changeset viewer.