Changes in src/SymTab/Indexer.cc [ce8c12f:af5c204a]
- File:
-
- 1 edited
-
src/SymTab/Indexer.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Indexer.cc
rce8c12f raf5c204a 124 124 }; 125 125 // properties for this type 126 bool userDefinedFunc = false; // any user-defined function found 127 bool userDefinedCtor = false; // any user-defined constructor found 128 bool userDefinedDtor = false; // any user-defined destructor found 129 bool userDefinedCopyFunc = false; // user-defined copy ctor found 126 bool existsUserDefinedFunc = false; // any user-defined function found 127 bool existsUserDefinedCtor = false; // any user-defined constructor found 128 bool existsUserDefinedDtor = false; // any user-defined destructor found 129 bool existsUserDefinedCopyFunc = false; // user-defined copy ctor found 130 bool existsUserDefinedDefaultCtor = false; // user-defined default ctor found 130 131 std::list< DeclBall > decls; 131 132 … … 138 139 bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() ); 139 140 decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultCtor, isDtor, isCopyFunc } ); 140 userDefinedFunc = userDefinedFunc || isUserDefinedFunc; 141 userDefinedCtor = userDefinedCtor || (isUserDefinedFunc && InitTweak::isConstructor( function->get_name() ) ); 142 userDefinedDtor = userDefinedDtor || (isUserDefinedFunc && isDtor); 143 userDefinedCopyFunc = userDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc); 141 existsUserDefinedFunc = existsUserDefinedFunc || isUserDefinedFunc; 142 existsUserDefinedCtor = existsUserDefinedCtor || (isUserDefinedFunc && InitTweak::isConstructor( function->get_name() ) ); 143 existsUserDefinedDtor = existsUserDefinedDtor || (isUserDefinedFunc && isDtor); 144 existsUserDefinedCopyFunc = existsUserDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc); 145 existsUserDefinedDefaultCtor = existsUserDefinedDefaultCtor || (isUserDefinedFunc && isDefaultCtor); 144 146 return *this; 145 147 } … … 156 158 assert( ! params.empty() ); 157 159 // use base type of pointer, so that qualifiers on the pointer type aren't considered. 158 Type * base = InitTweak::getPointerBase( params.front()->get_type() ); 159 assert( base ); 160 Type * base = safe_dynamic_cast< PointerType * >( params.front()->get_type() )->get_base(); 160 161 funcMap[ Mangler::mangle( base ) ] += function; 161 162 } else { … … 164 165 } 165 166 166 // if a type contains user defined ctor/dtor s, then special rules trigger, which determine167 // the set of ctor/dtor sthat are seen by the requester. In particular, if the user defines167 // if a type contains user defined ctor/dtor/assign, then special rules trigger, which determine 168 // the set of ctor/dtor/assign that are seen by the requester. In particular, if the user defines 168 169 // a default ctor, then the generated default ctor should never be seen, likewise for copy ctor 169 170 // and dtor. If the user defines any ctor/dtor, then no generated field ctors should be seen. 170 // If the user defines any ctor then the generated default ctor should not be seen. 171 // If the user defines any ctor then the generated default ctor should not be seen (intrinsic default 172 // ctor must be overridden exactly). 171 173 for ( std::pair< const std::string, ValueType > & pair : funcMap ) { 172 174 ValueType & val = pair.second; 173 175 for ( ValueType::DeclBall ball : val.decls ) { 174 if ( ! val.userDefinedFunc || ball.isUserDefinedFunc || (! val.userDefinedCtor && ball.isDefaultCtor) || (! val.userDefinedCopyFunc && ball.isCopyFunc) || (! val.userDefinedDtor && ball.isDtor) ) { 176 bool noUserDefinedFunc = ! val.existsUserDefinedFunc; 177 bool isUserDefinedFunc = ball.isUserDefinedFunc; 178 bool isAcceptableDefaultCtor = (! val.existsUserDefinedCtor || (! val.existsUserDefinedDefaultCtor && ball.decl->get_linkage() == LinkageSpec::Intrinsic)) && ball.isDefaultCtor; // allow default constructors only when no user-defined constructors exist, except in the case of intrinsics, which require exact overrides 179 bool isAcceptableCopyFunc = ! val.existsUserDefinedCopyFunc && ball.isCopyFunc; // handles copy ctor and assignment operator 180 bool isAcceptableDtor = ! val.existsUserDefinedDtor && ball.isDtor; 181 if ( noUserDefinedFunc || isUserDefinedFunc || isAcceptableDefaultCtor || isAcceptableCopyFunc || isAcceptableDtor ) { 175 182 // decl conforms to the rules described above, so it should be seen by the requester 176 183 out.push_back( ball.decl ); … … 278 285 addType( typeDecl ); 279 286 acceptAll( typeDecl->get_assertions(), *this ); 287 acceptNewScope( typeDecl->get_init(), *this ); 280 288 } 281 289 … … 487 495 } 488 496 489 void Indexer::visit( UntypedValofExpr *valofExpr ) {490 acceptNewScope( valofExpr->get_result(), *this );491 maybeAccept( valofExpr->get_body(), *this );492 }493 494 497 void Indexer::visit( RangeExpr *rangeExpr ) { 495 498 maybeAccept( rangeExpr->get_low(), *this ); … … 510 513 acceptNewScope( tupleExpr->get_result(), *this ); 511 514 maybeAccept( tupleExpr->get_tuple(), *this ); 512 }513 514 void Indexer::visit( MemberTupleExpr *tupleExpr ) {515 acceptNewScope( tupleExpr->get_result(), *this );516 maybeAccept( tupleExpr->get_member(), *this );517 maybeAccept( tupleExpr->get_aggregate(), *this );518 515 } 519 516
Note:
See TracChangeset
for help on using the changeset viewer.