Ignore:
Timestamp:
Jul 31, 2018, 2:43:04 PM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
642bc83
Parents:
d1e0979 (diff), 04e367c (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 demangler

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    rd1e0979 r3bbd012  
    6161#include "Parser/LinkageSpec.h"        // for C
    6262#include "ResolvExpr/typeops.h"        // for typesCompatible
     63#include "ResolvExpr/Resolver.h"       // for findSingleExpression
    6364#include "SymTab/Autogen.h"            // for SizeType
    6465#include "SynTree/Attribute.h"         // for noAttributes, Attribute
     
    7273#include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
    7374#include "SynTree/Visitor.h"           // for Visitor
     75#include "Validate/HandleAttributes.h" // for handleAttributes
    7476
    7577class CompoundStmt;
     
    247249        };
    248250
    249         struct ArrayLength {
     251        struct ArrayLength : public WithIndexer {
    250252                /// for array types without an explicit length, compute the length and store it so that it
    251253                /// is known to the rest of the phases. For example,
     
    258260
    259261                void previsit( ObjectDecl * objDecl );
     262                void previsit( ArrayType * arrayType );
    260263        };
    261264
     
    312315                acceptAll( translationUnit, finder ); // xxx - remove this pass soon
    313316                mutateAll( translationUnit, labelAddrFixer );
     317                Validate::handleAttributes( translationUnit );
    314318        }
    315319
     
    12321236        void ArrayLength::previsit( ObjectDecl * objDecl ) {
    12331237                if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->type ) ) {
    1234                         if ( at->get_dimension() ) return;
     1238                        if ( at->dimension ) return;
    12351239                        if ( ListInit * init = dynamic_cast< ListInit * >( objDecl->init ) ) {
    1236                                 at->set_dimension( new ConstantExpr( Constant::from_ulong( init->initializers.size() ) ) );
    1237                         }
     1240                                at->dimension = new ConstantExpr( Constant::from_ulong( init->initializers.size() ) );
     1241                        }
     1242                }
     1243        }
     1244
     1245        void ArrayLength::previsit( ArrayType * type ) {
     1246                if ( type->dimension ) {
     1247                        // need to resolve array dimensions early so that constructor code can correctly determine
     1248                        // if a type is a VLA (and hence whether its elements need to be constructed)
     1249                        ResolvExpr::findSingleExpression( type->dimension, SymTab::SizeType->clone(), indexer );
     1250
     1251                        // must re-evaluate whether a type is a VLA, now that more information is available
     1252                        // (e.g. the dimension may have been an enumerator, which was unknown prior to this step)
     1253                        type->isVarLen = ! InitTweak::isConstExpr( type->dimension );
    12381254                }
    12391255        }
Note: See TracChangeset for help on using the changeset viewer.