Ignore:
Timestamp:
Feb 24, 2023, 3:20:02 PM (17 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, ast-experimental, master
Children:
dc3c9b1
Parents:
43f29f6
Message:

copy typedef name to SUE name for anonymous SUE

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    r43f29f6 r78e2fca  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 16 14:12:03 2023
    13 // Update Count     : 1388
     12// Last Modified On : Fri Feb 24 11:10:03 2023
     13// Update Count     : 1400
    1414//
    1515
     
    254254        newnode->type->enumeration.typed = typed;
    255255        newnode->type->enumeration.hiding = hiding;
    256         if ( base && base->type)  {
     256        if ( base && base->type )  {
    257257                newnode->type->base = base->type;
    258258        } // if
     
    567567
    568568        checkQualifiers( type, q->type );
    569         if ( (builtin == Zero || builtin == One) && q->type->qualifiers.val != 0 && error.length() == 0 ) {
     569        if ( (builtin == Zero || builtin == One) && q->type->qualifiers.any() && error.length() == 0 ) {
    570570                SemanticWarning( yylloc, Warning::BadQualifiersZeroOne, Type::QualifiersNames[ilog2( q->type->qualifiers.val )], builtinTypeNames[builtin] );
    571571        } // if
     
    984984
    985985                        if ( DeclarationNode * extr = cur->extractAggregate() ) {
    986                                 // handle the case where a structure declaration is contained within an object or type declaration
     986                                // Handle the case where a SUE declaration is contained within an object or type declaration.
     987
     988                                assert( cur->type );
     989                                // Replace anonymous SUE name with typedef name to prevent anonymous naming problems across translation units.
     990                                if ( cur->type->kind == TypeData::Symbolic && cur->type->symbolic.isTypedef ) {
     991                                        assert( extr->type );
     992                                        // Handle anonymous aggregates: typedef struct { int i; } foo
     993                                        extr->type->qualifiers.reset();         // clear any CVs associated with the aggregate
     994                                        if ( extr->type->kind == TypeData::Aggregate && extr->type->aggregate.anon ) {
     995                                                delete extr->type->aggregate.name;
     996                                                extr->type->aggregate.name = new string( "__anonymous_" + *cur->name );
     997                                                extr->type->aggregate.anon = false;
     998                                                assert( cur->type->base );
     999                                                if ( cur->type->base ) {
     1000                                                        delete cur->type->base->aggInst.aggregate->aggregate.name;
     1001                                                        cur->type->base->aggInst.aggregate->aggregate.name = new string( "__anonymous_" + *cur->name );
     1002                                                        cur->type->base->aggInst.aggregate->aggregate.anon = false;
     1003                                                        cur->type->base->aggInst.aggregate->qualifiers.reset();
     1004                                                } // if
     1005                                        } // if
     1006                                        // Handle anonymous enumeration: typedef enum { A, B, C } foo
     1007                                        if ( extr->type->kind == TypeData::Enum && extr->type->enumeration.anon ) {
     1008                                                delete extr->type->enumeration.name;
     1009                                                extr->type->enumeration.name = new string( "__anonymous_" + *cur->name );
     1010                                                extr->type->enumeration.anon = false;
     1011                                                assert( cur->type->base );
     1012                                                if ( cur->type->base ) {
     1013                                                        delete cur->type->base->aggInst.aggregate->enumeration.name;
     1014                                                        cur->type->base->aggInst.aggregate->enumeration.name = new string( "__anonymous_" + *cur->name );
     1015                                                        cur->type->base->aggInst.aggregate->enumeration.anon = false;
     1016                                                } // if
     1017                                        } // if
     1018                                } // if
    9871019
    9881020                                Declaration * decl = extr->build();
Note: See TracChangeset for help on using the changeset viewer.