Ignore:
Timestamp:
Apr 15, 2016, 12:03:11 PM (9 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
29ad0ac
Parents:
c5833e8 (diff), 37f0da8 (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' into gc_noraii

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    rc5833e8 r0f9e4403  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 14 14:46:32 2015
    13 // Update Count     : 126
     12// Last Modified On : Wed Apr 13 16:53:17 2016
     13// Update Count     : 161
    1414//
    1515
     
    3434const char *DeclarationNode::storageName[] = { "extern", "static", "auto", "register", "inline", "fortran", "_Noreturn", "_Thread_local", "" };
    3535const char *DeclarationNode::qualifierName[] = { "const", "restrict", "volatile", "lvalue", "_Atomic" };
    36 const char *DeclarationNode::basicTypeName[] = { "char", "int", "float", "double", "void", "_Bool", "_Complex", "_Imaginary" };
     36const char *DeclarationNode::basicTypeName[] = { "char", "int", "float", "double", "void", "_Bool", "_Complex", "_Imaginary", };
    3737const char *DeclarationNode::modifierName[]  = { "signed", "unsigned", "short", "long" };
    3838const char *DeclarationNode::aggregateName[] = { "struct", "union", "context" };
    3939const char *DeclarationNode::typeClassName[] = { "type", "dtype", "ftype" };
     40const char *DeclarationNode::builtinTypeName[] = { "__builtin_va_list" };
    4041
    4142UniqueName DeclarationNode::anonymous( "__anonymous" );
    4243
    43 extern LinkageSpec::Type linkage;               /* defined in cfa.y */
     44extern LinkageSpec::Type linkage;                                               // defined in parser.yy
    4445
    4546DeclarationNode *DeclarationNode::clone() const {
     
    5455        newnode->linkage = linkage;
    5556        return newnode;
    56 }
     57} // DeclarationNode::clone
    5758
    5859DeclarationNode::DeclarationNode() : type( 0 ), bitfieldWidth( 0 ), initializer( 0 ), hasEllipsis( false ), linkage( ::linkage ) {
     
    116117        newnode->type->function->newStyle = newStyle;
    117118        newnode->type->function->body = body;
     119        typedefTable.addToEnclosingScope( newnode->name, TypedefTable::ID );
    118120
    119121        if ( body ) {
     
    128130
    129131        return newnode;
    130 }
     132} // DeclarationNode::newFunction
    131133
    132134DeclarationNode *DeclarationNode::newQualifier( Qualifier q ) {
     
    135137        newnode->type->qualifiers.push_back( q );
    136138        return newnode;
    137 }
     139} // DeclarationNode::newQualifier
    138140
    139141DeclarationNode *DeclarationNode::newStorageClass( DeclarationNode::StorageClass sc ) {
     
    141143        newnode->storageClasses.push_back( sc );
    142144        return newnode;
    143 }
     145} // DeclarationNode::newStorageClass
    144146
    145147DeclarationNode *DeclarationNode::newBasicType( BasicType bt ) {
     
    148150        newnode->type->basic->typeSpec.push_back( bt );
    149151        return newnode;
    150 }
     152} // DeclarationNode::newBasicType
     153
     154DeclarationNode *DeclarationNode::newBuiltinType( BuiltinType bt ) {
     155        DeclarationNode *newnode = new DeclarationNode;
     156        newnode->type = new TypeData( TypeData::Builtin );
     157        newnode->type->builtin->type = bt;
     158        return newnode;
     159} // DeclarationNode::newBuiltinType
    151160
    152161DeclarationNode *DeclarationNode::newModifier( Modifier mod ) {
     
    155164        newnode->type->basic->modifiers.push_back( mod );
    156165        return newnode;
    157 }
     166} // DeclarationNode::newModifier
    158167
    159168DeclarationNode *DeclarationNode::newForall( DeclarationNode *forall ) {
     
    162171        newnode->type->forall = forall;
    163172        return newnode;
    164 }
     173} // DeclarationNode::newForall
    165174
    166175DeclarationNode *DeclarationNode::newFromTypedef( std::string *name ) {
     
    171180        newnode->type->symbolic->params = 0;
    172181        return newnode;
    173 }
     182} // DeclarationNode::newFromTypedef
    174183
    175184DeclarationNode *DeclarationNode::newAggregate( Aggregate kind, const std::string *name, ExpressionNode *actuals, DeclarationNode *fields ) {
     
    179188        newnode->type->aggregate->name = assign_strptr( name );
    180189        if ( newnode->type->aggregate->name == "" ) {           // anonymous aggregate ?
    181                 newnode->type->aggregate->name = DeclarationNode::anonymous.newName();
    182         } else {
    183                 // SKULLDUGGERY: generate a typedef for the aggregate name so that the aggregate does not have to be qualified
    184                 // by "struct"
    185                 typedefTable.addToEnclosingScope( newnode->type->aggregate->name, TypedefTable::TD );
    186                 DeclarationNode *typedf = new DeclarationNode;
    187                 typedf->name = newnode->type->aggregate->name;
    188                 newnode->appendList( typedf->addType( newnode->clone() )->addTypedef() );
     190                newnode->type->aggregate->name = anonymous.newName();
    189191        } // if
    190192        newnode->type->aggregate->actuals = actuals;
    191193        newnode->type->aggregate->fields = fields;
    192194        return newnode;
    193 }
     195} // DeclarationNode::newAggregate
    194196
    195197DeclarationNode *DeclarationNode::newEnum( std::string *name, DeclarationNode *constants ) {
     
    200202        if ( newnode->type->enumeration->name == "" ) {         // anonymous enumeration ?
    201203                newnode->type->enumeration->name = DeclarationNode::anonymous.newName();
    202         } else {
    203                 // SKULLDUGGERY: generate a typedef for the enumeration name so that the enumeration does not have to be
    204                 // qualified by "enum"
    205                 typedefTable.addToEnclosingScope( newnode->type->enumeration->name, TypedefTable::TD );
    206                 DeclarationNode *typedf = new DeclarationNode;
    207                 typedf->name = newnode->type->enumeration->name;
    208                 newnode->appendList( typedf->addType( newnode->clone() )->addTypedef() );
    209204        } // if
    210205        newnode->type->enumeration->constants = constants;
    211206        return newnode;
    212 }
     207} // DeclarationNode::newEnum
    213208
    214209DeclarationNode *DeclarationNode::newEnumConstant( std::string *name, ExpressionNode *constant ) {
    215210        DeclarationNode *newnode = new DeclarationNode;
    216211        newnode->name = assign_strptr( name );
    217         // do something with the constant
    218         return newnode;
    219 }
     212        newnode->enumeratorValue = constant;
     213        typedefTable.addToEnclosingScope( newnode->name, TypedefTable::ID );
     214        return newnode;
     215} // DeclarationNode::newEnumConstant
    220216
    221217DeclarationNode *DeclarationNode::newName( std::string *name ) {
     
    223219        newnode->name = assign_strptr( name );
    224220        return newnode;
    225 }
     221} // DeclarationNode::newName
    226222
    227223DeclarationNode *DeclarationNode::newFromTypeGen( std::string *name, ExpressionNode *params ) {
     
    232228        newnode->type->symbolic->actuals = params;
    233229        return newnode;
    234 }
     230} // DeclarationNode::newFromTypeGen
    235231
    236232DeclarationNode *DeclarationNode::newTypeParam( TypeClass tc, std::string *name ) {
     
    241237        newnode->type->variable->name = newnode->name;
    242238        return newnode;
    243 }
    244 
    245 DeclarationNode *DeclarationNode::newContext( std::string *name, DeclarationNode *params, DeclarationNode *asserts ) {
     239} // DeclarationNode::newTypeParam
     240
     241DeclarationNode *DeclarationNode::newTrait( std::string *name, DeclarationNode *params, DeclarationNode *asserts ) {
    246242        DeclarationNode *newnode = new DeclarationNode;
    247243        newnode->type = new TypeData( TypeData::Aggregate );
    248         newnode->type->aggregate->kind = Context;
     244        newnode->type->aggregate->kind = Trait;
    249245        newnode->type->aggregate->params = params;
    250246        newnode->type->aggregate->fields = asserts;
    251247        newnode->type->aggregate->name = assign_strptr( name );
    252248        return newnode;
    253 }
    254 
    255 DeclarationNode *DeclarationNode::newContextUse( std::string *name, ExpressionNode *params ) {
     249} // DeclarationNode::newTrait
     250
     251DeclarationNode *DeclarationNode::newTraitUse( std::string *name, ExpressionNode *params ) {
    256252        DeclarationNode *newnode = new DeclarationNode;
    257253        newnode->type = new TypeData( TypeData::AggregateInst );
    258254        newnode->type->aggInst->aggregate = new TypeData( TypeData::Aggregate );
    259         newnode->type->aggInst->aggregate->aggregate->kind = Context;
     255        newnode->type->aggInst->aggregate->aggregate->kind = Trait;
    260256        newnode->type->aggInst->aggregate->aggregate->name = assign_strptr( name );
    261257        newnode->type->aggInst->params = params;
    262258        return newnode;
    263 }
     259} // DeclarationNode::newTraitUse
    264260
    265261DeclarationNode *DeclarationNode::newTypeDecl( std::string *name, DeclarationNode *typeParams ) {
     
    271267        newnode->type->symbolic->name = newnode->name;
    272268        return newnode;
    273 }
     269} // DeclarationNode::newTypeDecl
    274270
    275271DeclarationNode *DeclarationNode::newPointer( DeclarationNode *qualifiers ) {
     
    277273        newnode->type = new TypeData( TypeData::Pointer );
    278274        return newnode->addQualifiers( qualifiers );
    279 }
     275} // DeclarationNode::newPointer
    280276
    281277DeclarationNode *DeclarationNode::newArray( ExpressionNode *size, DeclarationNode *qualifiers, bool isStatic ) {
     
    290286        } // if
    291287        return newnode->addQualifiers( qualifiers );
    292 }
     288} // DeclarationNode::newArray
    293289
    294290DeclarationNode *DeclarationNode::newVarArray( DeclarationNode *qualifiers ) {
     
    794790                        errors.append( e );
    795791                } // try
    796                 cur = dynamic_cast< DeclarationNode *>( cur->get_link() );
     792                cur = dynamic_cast<DeclarationNode *>( cur->get_link() );
    797793        } // while
    798794        if ( ! errors.isEmpty() ) {
     
    881877                          ret = new UnionInstType( type->buildQualifiers(), type->aggregate->name );
    882878                          break;
    883                         case DeclarationNode::Context:
    884                           ret = new ContextInstType( type->buildQualifiers(), type->aggregate->name );
     879                        case DeclarationNode::Trait:
     880                          ret = new TraitInstType( type->buildQualifiers(), type->aggregate->name );
    885881                          break;
    886882                        default:
Note: See TracChangeset for help on using the changeset viewer.