Changeset 0a75b77
- Timestamp:
- Jun 4, 2018, 11:54:28 AM (6 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, with_gc
- Children:
- b429026
- Parents:
- 2a08c25
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Indexer.cc
r2a08c25 r0a75b77 106 106 if ( ! CodeGen::isCtorDtorAssign( id ) ) return; 107 107 108 // helpful data structure 108 // helpful data structure to organize properties for a type 109 109 struct ValueType { 110 struct DeclBall { 110 struct DeclBall { // properties for this particular decl 111 111 IdData decl; 112 bool isUserDefinedFunc; // properties for this particular decl 113 bool isDefaultCtor; 114 bool isDtor; 112 bool isUserDefinedFunc; 115 113 bool isCopyFunc; 116 114 }; 117 115 // properties for this type 118 bool existsUserDefinedFunc = false; // any user-defined function found119 bool existsUserDefinedCtor = false; // any user-defined constructor found120 bool existsUserDefinedDtor = false; // any user-defined destructor found121 116 bool existsUserDefinedCopyFunc = false; // user-defined copy ctor found 122 bool existsUserDefinedDefaultCtor = false; // user-defined default ctorfound117 BaseSyntaxNode * deleteStmt = nullptr; // non-null if a user-defined function is found 123 118 std::list< DeclBall > decls; 124 119 … … 127 122 ValueType & operator+=( IdData data ) { 128 123 DeclarationWithType * function = data.id; 129 bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() ); 130 bool isDefaultCtor = InitTweak::isDefaultConstructor( function ); 131 bool isDtor = InitTweak::isDestructor( function ); 132 bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() ); 133 decls.push_back( DeclBall{ data, isUserDefinedFunc, isDefaultCtor, isDtor, isCopyFunc } ); 134 existsUserDefinedFunc = existsUserDefinedFunc || isUserDefinedFunc; 135 existsUserDefinedCtor = existsUserDefinedCtor || (isUserDefinedFunc && CodeGen::isConstructor( function->get_name() ) ); 136 existsUserDefinedDtor = existsUserDefinedDtor || (isUserDefinedFunc && isDtor); 124 bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->linkage ); 125 bool isCopyFunc = InitTweak::isCopyFunction( function, function->name ); 126 decls.push_back( DeclBall{ data, isUserDefinedFunc, isCopyFunc } ); 137 127 existsUserDefinedCopyFunc = existsUserDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc); 138 existsUserDefinedDefaultCtor = existsUserDefinedDefaultCtor || (isUserDefinedFunc && isDefaultCtor); 128 if ( isUserDefinedFunc && ! data.deleteStmt ) { 129 // any user-defined function can act as an implicit delete statement for generated constructors. 130 // a delete stmt should not act as an implicit delete statement. 131 deleteStmt = data.id; 132 } 139 133 return *this; 140 134 } … … 160 154 161 155 // if a type contains user defined ctor/dtor/assign, then special rules trigger, which determine 162 // the set of ctor/dtor/assign that are seen by the requester. In particular, if the user defines 163 // a default ctor, then the generated default ctor should never be seen, likewise for copy ctor 164 // and dtor. If the user defines any ctor/dtor, then no generated field ctors should be seen. 165 // If the user defines any ctor then the generated default ctor should not be seen (intrinsic default 166 // ctor must be overridden exactly). 156 // the set of ctor/dtor/assign that can be used by the requester. In particular, if the user defines 157 // a default ctor, then the generated default ctor is unavailable, likewise for copy ctor 158 // and dtor. If the user defines any ctor/dtor, then no generated field ctors are available. 159 // If the user defines any ctor then the generated default ctor is unavailable (intrinsic default 160 // ctor must be overridden exactly). If the user defines anything that looks like a copy constructor, 161 // then the generated copy constructor is unavailable, and likewise for the assignment operator. 167 162 for ( std::pair< const std::string, ValueType > & pair : funcMap ) { 168 163 ValueType & val = pair.second; 169 164 for ( ValueType::DeclBall ball : val.decls ) { 170 bool noUserDefinedFunc = ! val.existsUserDefinedFunc;171 bool is UserDefinedFunc = ball.isUserDefinedFunc;172 bool isAcceptableDefaultCtor = (! val.existsUserDefinedCtor || (! val.existsUserDefinedDefaultCtor && ball.decl.id->linkage == LinkageSpec::Intrinsic)) && ball.isDefaultCtor; // allow default constructors only when no user-defined constructors exist, except in the case of intrinsics, which require exact overrides173 bool isAcceptableCopyFunc = ! val.existsUserDefinedCopyFunc && ball.isCopyFunc; // handles copy ctor and assignment operator174 bool isAcceptableDtor = ! val.existsUserDefinedDtor && ball.isDtor;175 if ( noUserDefinedFunc || isUserDefinedFunc || isAcceptableDefaultCtor || isAcceptableCopyFunc || isAcceptableDtor ) {176 // decl conforms to the rules described above, so it should be seen by the requester177 out.push_back( ball.decl );165 bool isNotUserDefinedFunc = ! ball.isUserDefinedFunc && ball.decl.id->linkage != LinkageSpec::Intrinsic; 166 bool isCopyFunc = ball.isCopyFunc; 167 bool existsUserDefinedCopyFunc = val.existsUserDefinedCopyFunc; 168 // only implicitly delete non-user defined functions that are not intrinsic, and are 169 // not copy functions (assignment or copy constructor), unless a user-defined copy function exists. 170 // deleteStmt will be non-null only if a user-defined function is found. 171 if (isNotUserDefinedFunc && (! isCopyFunc || existsUserDefinedCopyFunc)) { 172 ball.decl.deleteStmt = val.deleteStmt; 178 173 } 174 out.push_back( ball.decl ); 179 175 } 180 176 } -
src/tests/raii/.expect/ctor-autogen-ERR1.txt
r2a08c25 r0a75b77 1 raii/ctor-autogen.c:102:1 error: No reasonable alternatives for expression Applying untyped:2 Name: ?{}3 ...to: 4 Cast of:5 Variable Expression: x: instance of struct Managed with body 16 ... to:7 reference to instance of struct Managed with body 18 constant expression (123 123: signed int)1 raii/ctor-autogen.c:102:1 error: Unique best alternative includes deleted identifier in Cast of: 2 Application of 3 Deleted Expression 4 Variable Expression: ?{}: static inline function 5 ... with parameters 6 _dst: reference to instance of struct Managed with body 1 7 x: signed int 8 ... returning nothing 9 9 10 ... deleted by: ?{}: function 11 ... with parameters 12 m: reference to instance of struct Managed with body 1 13 ... returning nothing 14 ... with body 15 CompoundStmt 16 Expression Statement: 17 Application of 18 Variable Expression: ?=?: function 19 ... with parameters 20 intrinsic reference to signed int 21 intrinsic signed int 22 ... returning 23 _retval__operator_assign: signed int 24 ... with attributes: 25 Attribute with name: unused 26 27 28 ... to arguments 29 Cast of: 30 Member Expression, with field: 31 x: signed int 32 ... from aggregate: 33 Cast of: 34 Variable Expression: m: reference to instance of struct Managed with body 1 35 ... to: 36 instance of struct Managed with body 1 37 ... to: 38 reference to signed int 39 Cast of: 40 constant expression (0 0: zero_t) 41 ... to: 42 signed int 43 44 ... with environment: 45 Types: 46 Non-types: 47 48 49 ... to arguments 50 Cast of: 51 Variable Expression: x: instance of struct Managed with body 1 52 ... to: 53 reference to instance of struct Managed with body 1 54 constant expression (123 123: signed int) 55 56 ... to: nothing
Note: See TracChangeset
for help on using the changeset viewer.