Changes in / [946bcca:615a096]
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/LaTeXmacros/common.tex
r946bcca r615a096 40 40 \newcommand{\CC}{\rm C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name 41 41 \newcommand{\CCeleven}{\rm C\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name 42 \newcommand{\CCfourteen}{\rm C\kern-.1em\hbox{+\kern-.25em+}14\xspace} % C++14 symbolic name43 42 \newcommand{\CCseventeen}{\rm C\kern-.1em\hbox{+\kern-.25em+}17\xspace} % C++17 symbolic name 44 43 \newcommand{\Celeven}{C11\xspace} % C11 symbolic name -
src/InitTweak/FixInit.cc
r946bcca r615a096 232 232 void handleFirstParam( Expression * firstParam ); 233 233 template< typename... Params > 234 void emit( CodeLocation,const Params &... params );234 void emit( const Params &... params ); 235 235 236 236 FunctionDecl * function = 0; 237 std::set< DeclarationWithType * > unhandled; 238 std::map< DeclarationWithType *, CodeLocation > usedUninit; 237 std::set< DeclarationWithType * > unhandled, usedUninit; 239 238 ObjectDecl * thisParam = 0; 240 239 bool isCtor = false; // true if current function is a constructor … … 337 336 GenStructMemberCalls warner; 338 337 acceptAll( translationUnit, warner ); 338 339 // visitor doesn't throw so that it can collect all errors 340 if ( ! warner.errors.isEmpty() ) { 341 throw warner.errors; 342 } 339 343 } 340 344 … … 936 940 ValueGuard< FunctionDecl * > oldFunction( funcDecl ); 937 941 ValueGuard< std::set< DeclarationWithType * > > oldUnhandled( unhandled ); 938 ValueGuard< std:: map< DeclarationWithType *, CodeLocation> > oldUsedUninit( usedUninit );942 ValueGuard< std::set< DeclarationWithType * > > oldUsedUninit( usedUninit ); 939 943 ValueGuard< ObjectDecl * > oldThisParam( thisParam ); 940 944 ValueGuard< bool > oldIsCtor( isCtor ); 941 945 ValueGuard< StructDecl * > oldStructDecl( structDecl ); 942 errors = SemanticError(); // clear previous errors943 946 944 947 // need to start with fresh sets … … 969 972 // remove the unhandled objects from usedUninit, because a call is inserted 970 973 // to handle them - only objects that are later constructed are used uninitialized. 971 std::map< DeclarationWithType *, CodeLocation > diff; 972 // need the comparator since usedUninit and unhandled have different types 973 struct comp_t { 974 typedef decltype(usedUninit)::value_type usedUninit_t; 975 typedef decltype(unhandled)::value_type unhandled_t; 976 bool operator()(usedUninit_t x, unhandled_t y) { return x.first < y; } 977 bool operator()(unhandled_t x, usedUninit_t y) { return x < y.first; } 978 } comp; 979 std::set_difference( usedUninit.begin(), usedUninit.end(), unhandled.begin(), unhandled.end(), std::inserter( diff, diff.begin() ), comp ); 980 for ( auto p : diff ) { 981 DeclarationWithType * member = p.first; 982 CodeLocation loc = p.second; 983 // xxx - make error message better by also tracking the location that the object is constructed at? 984 emit( loc, "in ", CodeGen::genPrettyType( function->get_functionType(), function->get_name() ), ", field ", member->get_name(), " used before being constructed" ); 974 std::set< DeclarationWithType * > diff; 975 std::set_difference( usedUninit.begin(), usedUninit.end(), unhandled.begin(), unhandled.end(), std::inserter( diff, diff.begin() ) ); 976 for ( DeclarationWithType * member : diff ) { 977 emit( "in ", CodeGen::genPrettyType( function->get_functionType(), function->get_name() ), ", field ", member->get_name(), " used before being constructed" ); 985 978 } 986 979 … … 1027 1020 } 1028 1021 } catch ( SemanticError & error ) { 1029 emit( funcDecl->location,"in ", CodeGen::genPrettyType( function->get_functionType(), function->get_name() ), ", field ", field->get_name(), " not explicitly ", isCtor ? "constructed" : "destructed", " and no ", isCtor ? "default constructor" : "destructor", " found" );1022 emit( "in ", CodeGen::genPrettyType( function->get_functionType(), function->get_name() ), ", field ", field->get_name(), " not explicitly ", isCtor ? "constructed" : "destructed", " and no ", isCtor ? "default constructor" : "destructor", " found" ); 1030 1023 } 1031 1024 } 1032 1025 } 1033 1026 leaveScope(); 1034 }1035 if (! errors.isEmpty()) {1036 throw errors;1037 1027 } 1038 1028 } … … 1089 1079 if ( unhandled.count( memberExpr->get_member() ) ) { 1090 1080 // emit a warning because a member was used before it was constructed 1091 usedUninit.insert( { memberExpr->get_member(), memberExpr->location });1081 usedUninit.insert( memberExpr->get_member() ); 1092 1082 } 1093 1083 } … … 1099 1089 1100 1090 template< typename Visitor, typename... Params > 1101 void error( Visitor & v, CodeLocation loc, const Params &... params ) { 1102 SemanticError err( toString( params... ) ); 1103 err.set_location( loc ); 1104 v.errors.append( err ); 1091 void error( Visitor & v, const Params &... params ) { 1092 v.errors.append( toString( params... ) ); 1105 1093 } 1106 1094 1107 1095 template< typename... Params > 1108 void GenStructMemberCalls::emit( CodeLocation loc,const Params &... params ) {1096 void GenStructMemberCalls::emit( const Params &... params ) { 1109 1097 // toggle warnings vs. errors here. 1110 1098 // warn( params... ); 1111 error( *this, loc,params... );1099 error( *this, params... ); 1112 1100 } 1113 1101 -
src/Parser/ExpressionNode.cc
r946bcca r615a096 254 254 Expression *build_pfieldSel( ExpressionNode *expr_node, Expression *member ) { 255 255 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 256 deref->location = expr_node->location;257 256 deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) ); 258 257 UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref ); -
src/Parser/ParseNode.h
r946bcca r615a096 134 134 Expression * p = orig->build(); 135 135 p->set_extension( orig->get_extension() ); 136 p->location = orig->location;137 136 return p; 138 137 } else { -
src/ResolvExpr/AlternativeFinder.cc
r946bcca r615a096 200 200 } 201 201 202 // Central location to handle gcc extension keyword , etc.for all expression types.202 // Central location to handle gcc extension keyword for all expression types. 203 203 for ( Alternative &iter: alternatives ) { 204 204 iter.expr->set_extension( expr->get_extension() ); 205 iter.expr->location = expr->location;206 205 } // for 207 206 } -
src/SynTree/Declaration.cc
r946bcca r615a096 32 32 33 33 Declaration::Declaration( const Declaration &other ) 34 : BaseSyntaxNode( other ),name( other.name ), storageClasses( other.storageClasses ), linkage( other.linkage ), uniqueId( other.uniqueId ) {34 : name( other.name ), storageClasses( other.storageClasses ), linkage( other.linkage ), uniqueId( other.uniqueId ) { 35 35 } 36 36 -
src/SynTree/Expression.cc
r946bcca r615a096 33 33 Expression::Expression( Expression *_aname ) : result( 0 ), env( 0 ), argName( _aname ) {} 34 34 35 Expression::Expression( const Expression &other ) : BaseSyntaxNode( other ),result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) {35 Expression::Expression( const Expression &other ) : result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) { 36 36 } 37 37 -
src/SynTree/Initializer.cc
r946bcca r615a096 20 20 21 21 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {} 22 Initializer::Initializer( const Initializer & other ) : BaseSyntaxNode( other ),maybeConstructed( other.maybeConstructed ) {22 Initializer::Initializer( const Initializer & other ) : maybeConstructed( other.maybeConstructed ) { 23 23 } 24 24 -
src/SynTree/Initializer.h
r946bcca r615a096 112 112 // ConstructorInit represents an initializer that is either a constructor expression or 113 113 // a C-style initializer. 114 // It should not be necessary to create ConstructorInit nodes manually. Instead, set maybeConstructed115 // to true on SingleInit or ListInit constructors if object should be constructed.116 114 class ConstructorInit : public Initializer { 117 115 public: -
src/SynTree/Type.cc
r946bcca r615a096 50 50 Type::Type( const Qualifiers &tq, const std::list< Attribute * > & attributes ) : tq( tq ), attributes( attributes ) {} 51 51 52 Type::Type( const Type &other ) : BaseSyntaxNode( other ),tq( other.tq ) {52 Type::Type( const Type &other ) : tq( other.tq ) { 53 53 cloneAll( other.forall, forall ); 54 54 cloneAll( other.attributes, attributes ); … … 84 84 printAll( attributes, os, indent+4 ); 85 85 } // if 86 86 87 87 tq.print( os ); 88 88 } -
src/Tuples/TupleExpansion.cc
r946bcca r615a096 126 126 /// given a expression representing the member and an expression representing the aggregate, 127 127 /// reconstructs a flattened UntypedMemberExpr with the right precedence 128 Expression * reconstructMemberExpr( Expression * member, Expression * aggr , CodeLocation & loc) {128 Expression * reconstructMemberExpr( Expression * member, Expression * aggr ) { 129 129 if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( member ) ) { 130 130 // construct a new UntypedMemberExpr with the correct structure , and recursively 131 131 // expand that member expression. 132 132 MemberTupleExpander expander; 133 UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ); 134 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), inner ); 135 inner->location = newMemberExpr->location = loc; 133 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ) ); 134 136 135 memberExpr->set_member(nullptr); 137 136 memberExpr->set_aggregate(nullptr); … … 140 139 } else { 141 140 // not a member expression, so there is nothing to do but attach and return 142 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( member, aggr->clone() ); 143 newMemberExpr->location = loc; 144 return newMemberExpr; 141 return new UntypedMemberExpr( member, aggr->clone() ); 145 142 } 146 143 } … … 155 152 aggr = new UniqueExpr( aggr ); 156 153 for ( Expression *& expr : tupleExpr->get_exprs() ) { 157 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); 158 expr->location = memberExpr->location; 154 expr = reconstructMemberExpr( expr, aggr ); 159 155 } 160 156 delete aggr; 161 tupleExpr->location = memberExpr->location;162 157 return tupleExpr; 163 158 } else { 164 159 // there may be a tuple expr buried in the aggregate 165 160 // xxx - this is a memory leak 166 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) ); 167 newMemberExpr->location = memberExpr->location; 168 return newMemberExpr; 161 return new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) ); 169 162 } 170 163 } -
src/tests/.expect/memberCtors-ERR1.txt
r946bcca r615a096 1 memberCtors.c:62error: in void ?{}(struct B *b), field a2 used before being constructed1 error: in void ?{}(struct B *b), field a2 used before being constructed 2 2 make: *** [memberCtors-ERR1] Error 1
Note: See TracChangeset
for help on using the changeset viewer.