Changeset 49148d5 for src/SymTab/Autogen.h
- Timestamp:
- Jul 12, 2017, 4:57:23 PM (8 years ago)
- 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, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- c5e3208
- Parents:
- a61ad31
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Autogen.h
ra61ad31 r49148d5 43 43 template< typename OutputIterator > 44 44 Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) { 45 // want to be able to generate assignment, ctor, and dtor generically,46 // so fname is either ?=?, ?{}, or ^?{}47 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) );45 // want to be able to generate assignment, ctor, and dtor generically, 46 // so fname is either ?=?, ?{}, or ^?{} 47 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) ); 48 48 49 // do something special for unnamed members 50 dstParam = new AddressExpr( dstParam ); 51 if ( addCast ) { 52 // cast to T* with qualifiers removed, so that qualified objects can be constructed 53 // and destructed with the same functions as non-qualified objects. 54 // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument 55 // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever 56 // remove lvalue as a qualifier, this can change to 57 // type->get_qualifiers() = Type::Qualifiers(); 58 assert( type ); 59 Type * castType = type->clone(); 60 castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic ); 61 castType->set_lvalue( true ); // xxx - might not need this 62 dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) ); 63 } 64 fExpr->get_args().push_back( dstParam ); 49 if ( addCast ) { 50 // cast to T& with qualifiers removed, so that qualified objects can be constructed 51 // and destructed with the same functions as non-qualified objects. 52 // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument 53 // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever 54 // remove lvalue as a qualifier, this can change to 55 // type->get_qualifiers() = Type::Qualifiers(); 56 assert( type ); 57 Type * castType = type->clone(); 58 castType->get_qualifiers() -= Type::Qualifiers( Type::Lvalue | Type::Const | Type::Volatile | Type::Restrict | Type::Atomic ); 59 // castType->set_lvalue( true ); // xxx - might not need this 60 dstParam = new CastExpr( dstParam, new ReferenceType( Type::Qualifiers(), castType ) ); 61 } 62 fExpr->get_args().push_back( dstParam ); 65 63 66 Statement * listInit = srcParam.buildListInit( fExpr );64 Statement * listInit = srcParam.buildListInit( fExpr ); 67 65 68 std::list< Expression * > args = *++srcParam;69 fExpr->get_args().splice( fExpr->get_args().end(), args );66 std::list< Expression * > args = *++srcParam; 67 fExpr->get_args().splice( fExpr->get_args().end(), args ); 70 68 71 *out++ = new ExprStmt( noLabels, fExpr );69 *out++ = new ExprStmt( noLabels, fExpr ); 72 70 73 srcParam.clearArrayIndices();71 srcParam.clearArrayIndices(); 74 72 75 return listInit;73 return listInit; 76 74 } 77 75 … … 109 107 110 108 UntypedExpr *inc = new UntypedExpr( update ); 111 inc->get_args().push_back( new AddressExpr( new VariableExpr( index )) );109 inc->get_args().push_back( new VariableExpr( index ) ); 112 110 113 111 UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
Note: See TracChangeset
for help on using the changeset viewer.