Changes in src/InitTweak/InitTweak.cc [cad355a:aedfd91]
- File:
-
- 1 edited
-
src/InitTweak/InitTweak.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/InitTweak.cc
rcad355a raedfd91 57 57 (objDecl->get_init() == NULL || 58 58 ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() )) && 59 ! isDesignated( objDecl->get_init() ); 59 ! isDesignated( objDecl->get_init() ) 60 && objDecl->get_storageClass() != DeclarationNode::Extern; 60 61 } 61 62 … … 84 85 } 85 86 } 87 namespace { 88 VariableExpr * getCalledFunction( ApplicationExpr * appExpr ) { 89 assert( appExpr ); 90 return dynamic_cast< VariableExpr * >( appExpr->get_function() ); 91 } 92 } 93 94 ApplicationExpr * isIntrinsicCallExpr( Expression * expr ) { 95 ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ); 96 if ( ! appExpr ) return NULL; 97 VariableExpr * function = getCalledFunction( appExpr ); 98 assert( function ); 99 // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor 100 // will call all member dtors, and some members may have a user defined dtor. 101 return function->get_var()->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL; 102 } 86 103 87 104 bool isInstrinsicSingleArgCallStmt( Statement * stmt ) { 88 105 Expression * callExpr = getCtorDtorCall( stmt ); 89 106 if ( ! callExpr ) return false; 90 ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( callExpr ); 91 assert( appExpr ); 92 VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() ); 93 assert( function ); 94 // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor 95 // will call all member dtors, and some members may have a user defined dtor. 96 FunctionType * funcType = GenPoly::getFunctionType( function->get_var()->get_type() ); 97 assert( funcType ); 98 return function->get_var()->get_linkage() == LinkageSpec::Intrinsic && funcType->get_parameters().size() == 1; 107 if ( ApplicationExpr * appExpr = isIntrinsicCallExpr( callExpr ) ) { 108 assert( ! appExpr->get_function()->get_results().empty() ); 109 FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_results().front() ); 110 assert( funcType ); 111 return funcType->get_parameters().size() == 1; 112 } 113 return false; 99 114 } 100 115 … … 160 175 else return NULL; 161 176 } 177 178 class ConstExprChecker : public Visitor { 179 public: 180 ConstExprChecker() : isConstExpr( true ) {} 181 182 virtual void visit( ApplicationExpr *applicationExpr ) { isConstExpr = false; } 183 virtual void visit( UntypedExpr *untypedExpr ) { isConstExpr = false; } 184 virtual void visit( NameExpr *nameExpr ) { isConstExpr = false; } 185 virtual void visit( CastExpr *castExpr ) { isConstExpr = false; } 186 virtual void visit( LabelAddressExpr *labAddressExpr ) { isConstExpr = false; } 187 virtual void visit( UntypedMemberExpr *memberExpr ) { isConstExpr = false; } 188 virtual void visit( MemberExpr *memberExpr ) { isConstExpr = false; } 189 virtual void visit( VariableExpr *variableExpr ) { isConstExpr = false; } 190 virtual void visit( ConstantExpr *constantExpr ) { /* bottom out */ } 191 // these might be okay? 192 // virtual void visit( SizeofExpr *sizeofExpr ); 193 // virtual void visit( AlignofExpr *alignofExpr ); 194 // virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 195 // virtual void visit( OffsetofExpr *offsetofExpr ); 196 // virtual void visit( OffsetPackExpr *offsetPackExpr ); 197 // virtual void visit( AttrExpr *attrExpr ); 198 // virtual void visit( CommaExpr *commaExpr ); 199 // virtual void visit( LogicalExpr *logicalExpr ); 200 // virtual void visit( ConditionalExpr *conditionalExpr ); 201 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; } 202 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; } 203 virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; } 204 virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; } 205 virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; } 206 virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; } 207 208 bool isConstExpr; 209 }; 210 211 bool isConstExpr( Expression * expr ) { 212 if ( expr ) { 213 ConstExprChecker checker; 214 expr->accept( checker ); 215 return checker.isConstExpr; 216 } 217 return true; 218 } 219 220 bool isConstExpr( Initializer * init ) { 221 if ( init ) { 222 ConstExprChecker checker; 223 init->accept( checker ); 224 return checker.isConstExpr; 225 } // if 226 // for all intents and purposes, no initializer means const expr 227 return true; 228 } 229 162 230 }
Note:
See TracChangeset
for help on using the changeset viewer.