Changes in / [add7117:f5e81d1]
- Location:
- src
- Files:
-
- 22 edited
-
InitTweak/FixInit.cc (modified) (7 diffs)
-
InitTweak/InitTweak.cc (modified) (4 diffs)
-
Parser/DeclarationNode.cc (modified) (7 diffs)
-
Parser/ParseNode.h (modified) (3 diffs)
-
Parser/TypeData.h (modified) (2 diffs)
-
Parser/parser.cc (modified) (1 diff)
-
Parser/parser.yy (modified) (1 diff)
-
ResolvExpr/AlternativeFinder.cc (modified) (6 diffs)
-
ResolvExpr/AlternativeFinder.h (modified) (3 diffs)
-
SymTab/Validate.cc (modified) (4 diffs)
-
SynTree/Expression.cc (modified) (4 diffs)
-
SynTree/Expression.h (modified) (2 diffs)
-
SynTree/Mutator.cc (modified) (2 diffs)
-
SynTree/Mutator.h (modified) (1 diff)
-
SynTree/SynTree.h (modified) (1 diff)
-
SynTree/Visitor.cc (modified) (2 diffs)
-
SynTree/Visitor.h (modified) (1 diff)
-
include/assert.h (modified) (1 diff)
-
libcfa/prelude.cf (modified) (2 diffs)
-
tests/.expect/declarationErrors.txt (modified) (1 diff)
-
tests/declarationErrors.c (modified) (2 diffs)
-
tests/test.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInit.cc
radd7117 rf5e81d1 33 33 #include "SymTab/Autogen.h" 34 34 #include "GenPoly/PolyMutator.h" 35 #include "GenPoly/DeclMutator.h"36 35 #include "SynTree/AddStmtVisitor.h" 37 36 #include "CodeGen/GenType.h" // for warnings … … 217 216 SymTab::Indexer & indexer; 218 217 }; 219 220 class FixCtorExprs : public GenPoly::DeclMutator {221 public:222 /// expands ConstructorExpr nodes into comma expressions, using a temporary for the first argument223 static void fix( std::list< Declaration * > & translationUnit );224 225 virtual Expression * mutate( ConstructorExpr * ctorExpr );226 };227 218 } // namespace 228 219 … … 230 221 // fixes ConstructorInit for global variables. should happen before fixInitializers. 231 222 InitTweak::fixGlobalInit( translationUnit, filename, inLibrary ); 232 233 223 234 224 InsertImplicitCalls::insert( translationUnit ); … … 241 231 242 232 GenStructMemberCalls::generate( translationUnit ); 243 // xxx - ctor expansion currently has to be after FixCopyCtors, because there is currently a244 // hack in the way untyped assignments are generated, where the first argument cannot have245 // its address taken because of the way codegeneration handles UntypedExpr vs. ApplicationExpr.246 // Thus such assignment exprs must never pushed through expression resolution (and thus should247 // not go through the FixCopyCtors pass), otherwise they will fail -- guaranteed.248 // Also needs to happen after GenStructMemberCalls, since otherwise member constructors exprs249 // don't look right, and a member can be constructed more than once.250 FixCtorExprs::fix( translationUnit );251 233 } 252 234 … … 301 283 throw warner.errors; 302 284 } 303 }304 305 void FixCtorExprs::fix( std::list< Declaration * > & translationUnit ) {306 FixCtorExprs fixer;307 fixer.mutateDeclarationList( translationUnit );308 285 } 309 286 … … 503 480 retExpr = deref; 504 481 } // if 505 retExpr->set_env( env->clone() ); 482 // xxx - might need to set env on retExpr... 483 // retExpr->set_env( env->clone() ); 506 484 return retExpr; 507 485 } else { … … 936 914 return safe_dynamic_cast< ApplicationExpr * >( ResolvExpr::findVoidExpression( untypedExpr, indexer ) ); 937 915 } 938 939 Expression * FixCtorExprs::mutate( ConstructorExpr * ctorExpr ) {940 static UniqueName tempNamer( "_tmp_ctor_expr" );941 assert( ctorExpr->get_results().size() == 1 );942 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_results().front()->clone(), nullptr );943 addDeclaration( tmp );944 945 ApplicationExpr * callExpr = safe_dynamic_cast< ApplicationExpr * > ( ctorExpr->get_callExpr() );946 TypeSubstitution * env = ctorExpr->get_env();947 ctorExpr->set_callExpr( nullptr );948 ctorExpr->set_env( nullptr );949 950 Expression *& firstArg = callExpr->get_args().front();951 UntypedExpr * assign = new UntypedExpr( new NameExpr( "?=?" ) );952 assign->get_args().push_back( new VariableExpr( tmp ) );953 assign->get_args().push_back( firstArg );954 cloneAll( ctorExpr->get_results(), assign->get_results() );955 firstArg = assign;956 957 CommaExpr * commaExpr = new CommaExpr( callExpr, new VariableExpr( tmp ) );958 commaExpr->set_env( env );959 delete ctorExpr;960 return commaExpr;961 }962 916 } // namespace 963 917 } // namespace InitTweak -
src/InitTweak/InitTweak.cc
radd7117 rf5e81d1 358 358 template<typename CallExpr> 359 359 Expression *& callArg( CallExpr * callExpr, unsigned int pos ) { 360 if ( pos >= callExpr->get_args().size() ) assert f( false,"asking for argument that doesn't exist. Return NULL/throw exception?" );360 if ( pos >= callExpr->get_args().size() ) assert( false && "asking for argument that doesn't exist. Return NULL/throw exception?" ); 361 361 for ( Expression *& arg : callExpr->get_args() ) { 362 362 if ( pos == 0 ) return arg; … … 373 373 return callArg( untypedExpr, pos ); 374 374 } else { 375 assert f( false,"Unexpected expression type passed to getCallArg" );375 assert( false && "Unexpected expression type passed to getCallArg" ); 376 376 } 377 377 } … … 388 388 return memberExpr->get_member()->get_name(); 389 389 } else { 390 assert f( false,"Unexpected expression type being called as a function in call expression" );390 assert( false && "Unexpected expression type being called as a function in call expression" ); 391 391 } 392 392 } … … 400 400 } else { 401 401 std::cerr << expr << std::endl; 402 assert f( false,"Unexpected expression type passed to getFunctionName" );402 assert( false && "Unexpected expression type passed to getFunctionName" ); 403 403 } 404 404 } -
src/Parser/DeclarationNode.cc
radd7117 rf5e81d1 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 9 23:21:47201613 // Update Count : 40212 // Last Modified On : Mon Aug 29 22:30:56 2016 13 // Update Count : 327 14 14 // 15 15 … … 43 43 extern LinkageSpec::Spec linkage; // defined in parser.yy 44 44 45 DeclarationNode::DeclarationNode() : 46 type( 0 ), 47 storageClass( NoStorageClass ), 48 isInline( false ), 49 isNoreturn( false ), 50 bitfieldWidth( 0 ), 51 initializer( 0 ), 52 hasEllipsis( false ), 53 linkage( ::linkage ), 54 extension( false ) { 45 DeclarationNode::DeclarationNode() 46 : type( 0 ) 47 , storageClass( NoStorageClass ) 48 , isInline( false ) 49 , isNoreturn( false ) 50 , bitfieldWidth( 0 ) 51 , initializer( 0 ) 52 , hasEllipsis( false ) 53 , linkage( ::linkage ) 54 , extension( false ) 55 , error() { 56 attr.expr = nullptr; 57 attr.type = nullptr; 58 55 59 variable.tyClass = DeclarationNode::Type; 56 60 variable.assertions = nullptr; 57 58 attr.expr = nullptr;59 attr.type = nullptr;60 61 } 61 62 … … 392 393 393 394 if ( (qsrc & qdst).any() ) { // common bits between qualifier masks ? 394 for ( int i = 0; i < NoOfQualifier; i += 1 ) { // find common qualifiers 395 if ( qsrc[i] & qdst[i] ) { 396 error += string(error.empty() ? "" : ", ") + "duplicate " + DeclarationNode::qualifierName[i]; 395 error = "duplicate qualifier "; 396 int j = 0; // separator detector 397 for ( int i = 0; i < DeclarationNode::NoOfQualifier; i += 1 ) { 398 if ( qsrc[i] & qdst[i] ) { // find specific qualifiers in common 399 if ( j > 0 ) error += ", "; 400 error += DeclarationNode::qualifierName[i]; 401 j += 1; 397 402 } // if 398 403 } // for 404 error += " in declaration of "; 399 405 } // if 400 406 } // DeclarationNode::checkQualifiers … … 436 442 storageClass = q->storageClass; 437 443 } else if ( q->storageClass != NoStorageClass ) { 438 if ( storageClass == q->storageClass ) { 439 q->error += string( "duplicate " ) + storageName[ storageClass ]; 440 } else { // can only have one storage class 441 q->error += string( "multiple " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ]; 442 } // if 443 } // if 444 if ( ! q->error.empty() ) { 445 error += (! error.empty() ? ", " : "") + q->error; 446 } // if 447 return this; 448 } // DeclarationNode::copyStorageClasses 444 q->error = "invalid combination of storage classes in declaration of "; 445 } // if 446 if ( error.empty() ) error = q->error; 447 return this; 448 } 449 449 450 450 static void addTypeToType( TypeData *&src, TypeData *&dst ) { … … 908 908 909 909 Declaration *DeclarationNode::build() const { 910 if ( ! error.empty() ) throw SemanticError( error + " in declaration of ", this );910 if ( ! error.empty() ) throw SemanticError( error, this ); 911 911 if ( type ) { 912 912 if ( type->kind == TypeData::Variable ) { … … 922 922 return (new ObjectDecl( name, storageClass, linkage, maybeBuild< Expression >( bitfieldWidth ), 0, maybeBuild< Initializer >( initializer ) ))->set_extension( extension ); 923 923 } // if 924 throw SemanticError( "invalid function specifier ", this );924 throw SemanticError( "invalid function specifier in declaration of ", this ); 925 925 } 926 926 … … 971 971 } 972 972 973 // DeclarationNode::StorageClass DeclarationNode::buildStorageClass() const { 974 // DeclarationNode::StorageClass ret = DeclarationNode::NoStorageClass; 975 // for ( std::list< DeclarationNode::StorageClass >::const_iterator i = storageClasses.begin(); i != storageClasses.end(); ++i ) { 976 // if ( *i == DeclarationNode::Inline || *i == DeclarationNode::Noreturn ) continue; // ignore function specifiers 977 // if ( ret != DeclarationNode::NoStorageClass ) { // already have a valid storage class ? 978 // throw SemanticError( "invalid combination of storage classes in declaration of ", this ); 979 // } // if 980 // ret = *i; 981 // } // for 982 // return ret; 983 // } 984 985 // bool DeclarationNode::buildFuncSpecifier( DeclarationNode::StorageClass key ) const { 986 // std::list< DeclarationNode::StorageClass >::const_iterator first = std::find( storageClasses.begin(), storageClasses.end(), key ); 987 // if ( first == storageClasses.end() ) return false; // not found 988 // first = std::find( ++first, storageClasses.end(), key ); // found 989 // if ( first == storageClasses.end() ) return true; // not found again 990 // throw SemanticError( "duplicate function specifier in declaration of ", this ); 991 // } 992 973 993 // Local Variables: // 974 994 // tab-width: 4 // -
src/Parser/ParseNode.h
radd7117 rf5e81d1 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Sep 8 21:58:06201613 // Update Count : 58 712 // Last Modified On : Mon Aug 29 21:45:43 2016 13 // Update Count : 583 14 14 // 15 15 … … 290 290 // bool buildFuncSpecifier( StorageClass key ) const; 291 291 292 struct Enumeration_t { 293 std::string name; 294 DeclarationNode * constants; 295 }; 296 Enumeration_t enumeration; 297 292 298 struct Variable_t { 293 299 DeclarationNode::TypeClass tyClass; … … 402 408 if ( result ) { 403 409 *out++ = result; 410 } else { 404 411 } // if 405 412 } catch( SemanticError &e ) { -
src/Parser/TypeData.h
radd7117 rf5e81d1 10 10 // Created On : Sat May 16 15:18:36 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 9 23:20:55201613 // Update Count : 11 712 // Last Modified On : Mon Aug 29 22:31:52 2016 13 // Update Count : 110 14 14 // 15 15 … … 96 96 Array_t array; 97 97 Enumeration_t enumeration; 98 // Variable_t variable;99 98 Function_t function; 100 99 Symbolic_t symbolic; 101 100 DeclarationNode * tuple; 102 101 ExpressionNode * typeexpr; 103 // Attr_t attr;102 //Attr_t attr; 104 103 // DeclarationNode::BuiltinType builtin; 105 104 -
src/Parser/parser.cc
radd7117 rf5e81d1 5125 5125 { 5126 5126 Token fn; 5127 fn.str = new std::string( "?{}" ); // location undefined - use location of '{'?5128 (yyval.en) = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( (yyvsp[(1) - (4)].en) )->set_last( (yyvsp[(3) - (4)].en)) ) ) );5127 fn.str = new std::string( "?{}" ); // location undefined 5128 (yyval.en) = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( (yyvsp[(1) - (4)].en) )->set_last( (yyvsp[(3) - (4)].en) ) ) ); 5129 5129 } 5130 5130 break; -
src/Parser/parser.yy
radd7117 rf5e81d1 391 391 { 392 392 Token fn; 393 fn.str = new std::string( "?{}" ); // location undefined - use location of '{'?394 $$ = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 )) ) );393 fn.str = new std::string( "?{}" ); // location undefined 394 $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) ); 395 395 } 396 396 ; -
src/ResolvExpr/AlternativeFinder.cc
radd7117 rf5e81d1 209 209 } 210 210 211 void AlternativeFinder::find( Expression *expr, bool adjust , bool prune) {211 void AlternativeFinder::find( Expression *expr, bool adjust ) { 212 212 expr->accept( *this ); 213 213 if ( alternatives.empty() ) { … … 219 219 } 220 220 } 221 if ( prune ) { 222 PRINT( 223 std::cerr << "alternatives before prune:" << std::endl; 224 printAlts( alternatives, std::cerr ); 225 ) 226 AltList::iterator oldBegin = alternatives.begin(); 227 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer ); 228 if ( alternatives.begin() == oldBegin ) { 229 std::ostringstream stream; 230 stream << "Can't choose between alternatives for expression "; 231 expr->print( stream ); 232 stream << "Alternatives are:"; 233 AltList winners; 234 findMinCost( alternatives.begin(), alternatives.end(), back_inserter( winners ) ); 235 printAlts( winners, stream, 8 ); 236 throw SemanticError( stream.str() ); 237 } 238 alternatives.erase( oldBegin, alternatives.end() ); 239 PRINT( 240 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 241 ) 242 } 221 PRINT( 222 std::cerr << "alternatives before prune:" << std::endl; 223 printAlts( alternatives, std::cerr ); 224 ) 225 AltList::iterator oldBegin = alternatives.begin(); 226 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer ); 227 if ( alternatives.begin() == oldBegin ) { 228 std::ostringstream stream; 229 stream << "Can't choose between alternatives for expression "; 230 expr->print( stream ); 231 stream << "Alternatives are:"; 232 AltList winners; 233 findMinCost( alternatives.begin(), alternatives.end(), back_inserter( winners ) ); 234 printAlts( winners, stream, 8 ); 235 throw SemanticError( stream.str() ); 236 } 237 alternatives.erase( oldBegin, alternatives.end() ); 238 PRINT( 239 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 240 ) 243 241 244 242 // Central location to handle gcc extension keyword for all expression types. … … 248 246 } 249 247 250 void AlternativeFinder::findWithAdjustment( Expression *expr , bool prune) {251 find( expr, true , prune);248 void AlternativeFinder::findWithAdjustment( Expression *expr ) { 249 find( expr, true ); 252 250 } 253 251 254 252 template< typename StructOrUnionType > 255 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env,Expression * member ) {253 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, Expression * member ) { 256 254 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member ); 257 255 const std::string & name = nameExpr->get_name(); 256 258 257 std::list< Declaration* > members; 259 258 aggInst->lookup( name, members ); … … 814 813 if ( agg->expr->get_results().size() == 1 ) { 815 814 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_results().front() ) ) { 816 addAggMembers( structInst, agg->expr, agg->cost, agg->env,memberExpr->get_member() );815 addAggMembers( structInst, agg->expr, agg->cost, memberExpr->get_member() ); 817 816 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_results().front() ) ) { 818 addAggMembers( unionInst, agg->expr, agg->cost, agg->env,memberExpr->get_member() );817 addAggMembers( unionInst, agg->expr, agg->cost, memberExpr->get_member() ); 819 818 } // if 820 819 } // if … … 844 843 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { 845 844 NameExpr nameExpr( "" ); 846 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env,&nameExpr );845 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), &nameExpr ); 847 846 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) { 848 847 NameExpr nameExpr( "" ); 849 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env,&nameExpr );848 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), &nameExpr ); 850 849 } // if 851 850 } // for … … 1068 1067 alternatives.push_back( Alternative( impCpCtorExpr->clone(), env, Cost::zero ) ); 1069 1068 } 1070 1071 void AlternativeFinder::visit( ConstructorExpr * ctorExpr ) {1072 AlternativeFinder finder( indexer, env );1073 // don't prune here, since it's guaranteed all alternatives will have the same type1074 // (giving the alternatives different types is half of the point of ConstructorExpr nodes)1075 finder.findWithAdjustment( ctorExpr->get_callExpr(), false );1076 for ( Alternative & alt : finder.alternatives ) {1077 alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) );1078 }1079 }1080 1069 } // namespace ResolvExpr 1081 1070 -
src/ResolvExpr/AlternativeFinder.h
radd7117 rf5e81d1 29 29 public: 30 30 AlternativeFinder( const SymTab::Indexer &indexer, const TypeEnvironment &env ); 31 void find( Expression *expr, bool adjust = false , bool prune = true);31 void find( Expression *expr, bool adjust = false ); 32 32 /// Calls find with the adjust flag set; adjustment turns array and function types into equivalent pointer types 33 void findWithAdjustment( Expression *expr , bool prune = true);33 void findWithAdjustment( Expression *expr ); 34 34 AltList &get_alternatives() { return alternatives; } 35 35 … … 66 66 virtual void visit( TupleExpr *tupleExpr ); 67 67 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 68 virtual void visit( ConstructorExpr * ctorExpr );69 68 public: // xxx - temporary hack - should make Tuples::TupleAssignment a friend 70 69 /// Runs a new alternative finder on each element in [begin, end) … … 75 74 private: 76 75 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 77 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env,Expression * member );76 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, Expression * member ); 78 77 /// Adds alternatives for offsetof expressions, given the base type and name of the member 79 78 template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name ); -
src/SymTab/Validate.cc
radd7117 rf5e81d1 60 60 #include "ResolvExpr/typeops.h" 61 61 #include <algorithm> 62 #include "InitTweak/InitTweak.h"63 62 64 63 #define debugPrint( x ) if ( doDebug ) { std::cout << x; } … … 172 171 }; 173 172 174 class VerifyCtorDtor Assign: public Visitor {173 class VerifyCtorDtor : public Visitor { 175 174 public: 176 /// ensure that constructors , destructors, and assignmenthave at least one177 /// parameter, the first of which must be a pointer, and that ctor/dtors haveno175 /// ensure that constructors and destructors have at least one 176 /// parameter, the first of which must be a pointer, and no 178 177 /// return values. 179 178 static void verify( std::list< Declaration * > &translationUnit ); … … 203 202 compoundliteral.mutateDeclarationList( translationUnit ); 204 203 acceptAll( translationUnit, pass3 ); 205 VerifyCtorDtor Assign::verify( translationUnit );204 VerifyCtorDtor::verify( translationUnit ); 206 205 } 207 206 … … 688 687 } 689 688 690 void VerifyCtorDtor Assign::verify( std::list< Declaration * > & translationUnit ) {691 VerifyCtorDtor Assignverifier;689 void VerifyCtorDtor::verify( std::list< Declaration * > & translationUnit ) { 690 VerifyCtorDtor verifier; 692 691 acceptAll( translationUnit, verifier ); 693 692 } 694 693 695 void VerifyCtorDtor Assign::visit( FunctionDecl * funcDecl ) {694 void VerifyCtorDtor::visit( FunctionDecl * funcDecl ) { 696 695 FunctionType * funcType = funcDecl->get_functionType(); 697 696 std::list< DeclarationWithType * > &returnVals = funcType->get_returnVals(); 698 697 std::list< DeclarationWithType * > ¶ms = funcType->get_parameters(); 699 698 700 if ( InitTweak::isCtorDtorAssign( funcDecl->get_name() )) {699 if ( funcDecl->get_name() == "?{}" || funcDecl->get_name() == "^?{}" ) { 701 700 if ( params.size() == 0 ) { 702 throw SemanticError( "Constructors , destructors, and assignment functions require at least one parameter ", funcDecl );701 throw SemanticError( "Constructors and destructors require at least one parameter ", funcDecl ); 703 702 } 704 703 if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) { 705 throw SemanticError( "First parameter of a constructor , destructor, or assignment functionmust be a pointer ", funcDecl );704 throw SemanticError( "First parameter of a constructor or destructor must be a pointer ", funcDecl ); 706 705 } 707 if ( InitTweak::isCtorDtor( funcDecl->get_name() ) &&returnVals.size() != 0 ) {706 if ( returnVals.size() != 0 ) { 708 707 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl ); 709 708 } -
src/SynTree/Expression.cc
radd7117 rf5e81d1 28 28 #include "TypeSubstitution.h" 29 29 #include "Common/utility.h" 30 #include "InitTweak/InitTweak.h"31 30 32 31 … … 497 496 498 497 void ImplicitCopyCtorExpr::print( std::ostream &os, int indent ) const { 499 os << "Implicit Copy Constructor Expression: " << std::endl;498 os << std::string( indent, ' ' ) << "Implicit Copy Constructor Expression: " << std::endl; 500 499 assert( callExpr ); 501 500 callExpr->print( os, indent + 2 ); … … 507 506 } 508 507 509 510 ConstructorExpr::ConstructorExpr( Expression * callExpr ) : callExpr( callExpr ) { 511 // allow resolver to type a constructor used as an expression as if it has the same type as its first argument 512 assert( callExpr ); 513 Expression * arg = InitTweak::getCallArg( callExpr, 0 ); 514 assert( arg ); 515 cloneAll( arg->get_results(), results ); 516 } 517 518 ConstructorExpr::ConstructorExpr( const ConstructorExpr & other ) : Expression( other ), callExpr( maybeClone( other.callExpr ) ) { 519 } 520 521 ConstructorExpr::~ConstructorExpr() { 522 delete callExpr; 523 } 524 525 void ConstructorExpr::print( std::ostream &os, int indent ) const { 526 os << "Constructor Expression: " << std::endl; 527 assert( callExpr ); 528 os << std::string( indent+2, ' ' ); 529 callExpr->print( os, indent + 2 ); 530 Expression::print( os, indent ); 508 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {} 509 510 UntypedValofExpr::~UntypedValofExpr() { delete body; } 511 512 void UntypedValofExpr::print( std::ostream &os, int indent ) const { 513 os << std::string( indent, ' ' ) << "Valof Expression: " << std::endl; 514 if ( get_body() != 0 ) 515 get_body()->print( os, indent + 2 ); 531 516 } 532 517 … … 547 532 if ( type ) type->print( os, indent + 2 ); 548 533 if ( initializer ) initializer->print( os, indent + 2 ); 549 }550 551 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {}552 553 UntypedValofExpr::~UntypedValofExpr() { delete body; }554 555 void UntypedValofExpr::print( std::ostream &os, int indent ) const {556 os << std::string( indent, ' ' ) << "Valof Expression: " << std::endl;557 if ( get_body() != 0 )558 get_body()->print( os, indent + 2 );559 534 } 560 535 -
src/SynTree/Expression.h
radd7117 rf5e81d1 595 595 }; 596 596 597 /// ConstructorExpr represents the use of a constructor in an expression context, e.g. int * x = malloc() { 5 };598 class ConstructorExpr : public Expression {599 public:600 ConstructorExpr( Expression * callExpr );601 ConstructorExpr( const ConstructorExpr & other );602 ~ConstructorExpr();603 604 Expression *get_ callExpr() const { return callExpr; }605 void set_callExpr( Expression *newValue ) { callExpr = newValue; }606 607 virtual ConstructorExpr *clone() const { return new ConstructorExpr( *this ); }608 virtual void accept( Visitor &v ) { v.visit( this ); } 609 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 610 virtual void print( std::ostream &os, int indent = 0 ) const; 611 private:612 Expression * callExpr;597 /// ValofExpr represents a GCC 'lambda expression' 598 class UntypedValofExpr : public Expression { 599 public: 600 UntypedValofExpr( Statement *_body, Expression *_aname = nullptr ) : Expression( _aname ), body ( _body ) {} 601 UntypedValofExpr( const UntypedValofExpr & other ); 602 virtual ~UntypedValofExpr(); 603 604 Expression *get_value(); 605 Statement *get_body() const { return body; } 606 607 virtual UntypedValofExpr *clone() const { return new UntypedValofExpr( *this ); } 608 virtual void accept( Visitor &v ) { v.visit( this ); } 609 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 610 virtual void print( std::ostream &os, int indent = 0 ) const; 611 private: 612 Statement *body; 613 613 }; 614 614 … … 635 635 }; 636 636 637 /// ValofExpr represents a GCC 'lambda expression'638 class UntypedValofExpr : public Expression {639 public:640 UntypedValofExpr( Statement *_body, Expression *_aname = nullptr ) : Expression( _aname ), body ( _body ) {}641 UntypedValofExpr( const UntypedValofExpr & other );642 virtual ~UntypedValofExpr();643 644 Expression *get_value();645 Statement *get_body() const { return body; }646 647 virtual UntypedValofExpr *clone() const { return new UntypedValofExpr( *this ); }648 virtual void accept( Visitor &v ) { v.visit( this ); }649 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }650 virtual void print( std::ostream &os, int indent = 0 ) const;651 private:652 Statement *body;653 };654 655 /// RangeExpr represents a range e.g. '3 ... 5' or '1~10'656 637 class RangeExpr : public Expression { 657 638 public: -
src/SynTree/Mutator.cc
radd7117 rf5e81d1 340 340 } 341 341 342 Expression* Mutator::mutate( ConstructorExpr *ctorExpr ) { 343 mutateAll( ctorExpr->get_results(), *this ); 344 ctorExpr->set_callExpr( maybeMutate( ctorExpr->get_callExpr(), *this ) ); 345 return ctorExpr; 342 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) { 343 mutateAll( valofExpr->get_results(), *this ); 344 return valofExpr; 346 345 } 347 346 … … 351 350 compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) ); 352 351 return compLitExpr; 353 }354 355 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) {356 mutateAll( valofExpr->get_results(), *this );357 return valofExpr;358 352 } 359 353 -
src/SynTree/Mutator.h
radd7117 rf5e81d1 76 76 virtual Expression* mutate( AsmExpr *asmExpr ); 77 77 virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr ); 78 virtual Expression* mutate( ConstructorExpr *ctorExpr );78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 79 79 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ); 80 virtual Expression* mutate( UntypedValofExpr *valofExpr );81 80 virtual Expression* mutate( RangeExpr *rangeExpr ); 82 81 virtual Expression* mutate( TupleIndexExpr *tupleExpr ); -
src/SynTree/SynTree.h
radd7117 rf5e81d1 81 81 class AsmExpr; 82 82 class ImplicitCopyCtorExpr; 83 class ConstructorExpr;83 class UntypedValofExpr; 84 84 class CompoundLiteralExpr; 85 class UntypedValofExpr;86 85 class RangeExpr; 87 86 class TupleIndexExpr; -
src/SynTree/Visitor.cc
radd7117 rf5e81d1 288 288 } 289 289 290 void Visitor::visit( ConstructorExpr * ctorExpr ) {291 acceptAll( ctorExpr->get_results(), *this );292 maybeAccept( ctorExpr->get_callExpr(), *this );290 void Visitor::visit( UntypedValofExpr *valofExpr ) { 291 acceptAll( valofExpr->get_results(), *this ); 292 maybeAccept( valofExpr->get_body(), *this ); 293 293 } 294 294 … … 297 297 maybeAccept( compLitExpr->get_type(), *this ); 298 298 maybeAccept( compLitExpr->get_initializer(), *this ); 299 }300 301 void Visitor::visit( UntypedValofExpr *valofExpr ) {302 acceptAll( valofExpr->get_results(), *this );303 maybeAccept( valofExpr->get_body(), *this );304 299 } 305 300 -
src/SynTree/Visitor.h
radd7117 rf5e81d1 76 76 virtual void visit( AsmExpr *asmExpr ); 77 77 virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr ); 78 virtual void visit( ConstructorExpr * ctorExpr );78 virtual void visit( UntypedValofExpr *valofExpr ); 79 79 virtual void visit( CompoundLiteralExpr *compLitExpr ); 80 virtual void visit( UntypedValofExpr *valofExpr );81 80 virtual void visit( RangeExpr *rangeExpr ); 82 81 virtual void visit( TupleIndexExpr *tupleExpr ); -
src/include/assert.h
radd7117 rf5e81d1 22 22 #define assertf(expr, fmt, ...) ((expr) ? static_cast<void>(0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ )) 23 23 24 void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) __attribute__((noreturn));24 void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ); 25 25 26 26 template<typename T, typename U> -
src/libcfa/prelude.cf
radd7117 rf5e81d1 636 636 637 637 // default ctor 638 void ?{}( _Bool * ) ;639 void ?{}( char * ) ;640 void ?{}( unsigned char * ) ;641 void ?{}( char signed * ) ;642 void ?{}( int short * ) ;643 void ?{}( int short unsigned * ) ;644 void ?{}( signed int * ) ;645 void ?{}( unsigned int * ) ;646 void ?{}( signed long int * ) ;647 void ?{}( unsigned long int * ) ;648 void ?{}( signed long long int * ) ;649 void ?{}( unsigned long long int * ) ;650 void ?{}( float * ) ;651 void ?{}( double * ) ;652 void ?{}( long double * ) ;653 void ?{}( float _Complex * ) ;654 void ?{}( double _Complex * ) ;655 void ?{}( long double _Complex * ) ;638 void ?{}( _Bool * ), ?{}( volatile _Bool * ); 639 void ?{}( char * ), ?{}( volatile char * ); 640 void ?{}( unsigned char * ), ?{}( volatile unsigned char * ); 641 void ?{}( char signed * ), ?{}( volatile char signed * ); 642 void ?{}( int short * ), ?{}( volatile int short * ); 643 void ?{}( int short unsigned * ), ?{}( volatile int short unsigned * ); 644 void ?{}( signed int * ), ?{}( volatile signed int * ); 645 void ?{}( unsigned int * ), ?{}( volatile unsigned int * ); 646 void ?{}( signed long int * ), ?{}( volatile signed long int * ); 647 void ?{}( unsigned long int * ), ?{}( volatile unsigned long int * ); 648 void ?{}( signed long long int * ), ?{}( volatile signed long long int * ); 649 void ?{}( unsigned long long int * ), ?{}( volatile unsigned long long int * ); 650 void ?{}( float * ), ?{}( volatile float * ); 651 void ?{}( double * ), ?{}( volatile double * ); 652 void ?{}( long double * ), ?{}( volatile long double * ); 653 void ?{}( float _Complex * ), ?{}( volatile float _Complex * ); 654 void ?{}( double _Complex * ), ?{}( volatile double _Complex * ); 655 void ?{}( long double _Complex * ), ?{}( volatile long double _Complex * ); 656 656 657 657 // copy ctor 658 void ?{}( _Bool *, _Bool ) ;659 void ?{}( char *, char ) ;660 void ?{}( unsigned char *, unsigned char ) ;661 void ?{}( char signed *, char signed ) ;662 void ?{}( int short *, int short ) ;663 void ?{}( int short unsigned *, int short unsigned ) ;664 void ?{}( signed int *, signed int) ;665 void ?{}( unsigned int *, unsigned int) ;666 void ?{}( signed long int *, signed long int) ;667 void ?{}( unsigned long int *, unsigned long int) ;668 void ?{}( signed long long int *, signed long long int) ;669 void ?{}( unsigned long long int *, unsigned long long int) ;670 void ?{}( float *, float) ;671 void ?{}( double *, double) ;672 void ?{}( long double *, long double) ;673 void ?{}( float _Complex *, float _Complex) ;674 void ?{}( double _Complex *, double _Complex) ;675 void ?{}( long double _Complex *, long double _Complex) ;658 void ?{}( _Bool *, _Bool ), ?{}( volatile _Bool *, _Bool ); 659 void ?{}( char *, char ), ?{}( volatile char *, char ); 660 void ?{}( unsigned char *, unsigned char ), ?{}( volatile unsigned char *, unsigned char ); 661 void ?{}( char signed *, char signed ), ?{}( volatile char signed *, char signed ); 662 void ?{}( int short *, int short ), ?{}( volatile int short *, int short ); 663 void ?{}( int short unsigned *, int short unsigned ), ?{}( volatile int short unsigned *, int short unsigned ); 664 void ?{}( signed int *, signed int), ?{}( volatile signed int *, signed int ); 665 void ?{}( unsigned int *, unsigned int), ?{}( volatile unsigned int *, unsigned int ); 666 void ?{}( signed long int *, signed long int), ?{}( volatile signed long int *, signed long int ); 667 void ?{}( unsigned long int *, unsigned long int), ?{}( volatile unsigned long int *, unsigned long int ); 668 void ?{}( signed long long int *, signed long long int), ?{}( volatile signed long long int *, signed long long int ); 669 void ?{}( unsigned long long int *, unsigned long long int), ?{}( volatile unsigned long long int *, unsigned long long int ); 670 void ?{}( float *, float), ?{}( volatile float *, float ); 671 void ?{}( double *, double), ?{}( volatile double *, double ); 672 void ?{}( long double *, long double), ?{}( volatile long double *, long double ); 673 void ?{}( float _Complex *, float _Complex), ?{}( volatile float _Complex *, float _Complex ); 674 void ?{}( double _Complex *, double _Complex), ?{}( volatile double _Complex *, double _Complex ); 675 void ?{}( long double _Complex *, long double _Complex), ?{}( volatile long double _Complex *, long double _Complex ); 676 676 677 677 // dtor 678 void ^?{}( _Bool * ) ;679 void ^?{}( char * ) ;680 void ^?{}( char unsigned * ) ;681 void ^?{}( char signed * ) ;682 void ^?{}( int short * ) ;683 void ^?{}( int short unsigned * ) ;684 void ^?{}( signed int * ) ;685 void ^?{}( unsigned int * ) ;686 void ^?{}( signed long int * ) ;687 void ^?{}( unsigned long int * ) ;688 void ^?{}( signed long long int * ) ;689 void ^?{}( unsigned long long int * ) ;690 void ^?{}( float * ) ;691 void ^?{}( double * ) ;692 void ^?{}( long double * ) ;693 void ^?{}( float _Complex * ) ;694 void ^?{}( double _Complex * ) ;695 void ^?{}( long double _Complex * ) ;678 void ^?{}( _Bool * ), ^?{}( volatile _Bool * ); 679 void ^?{}( char * ), ^?{}( volatile char * ); 680 void ^?{}( char unsigned * ), ^?{}( volatile char unsigned * ); 681 void ^?{}( char signed * ), ^?{}( volatile char signed * ); 682 void ^?{}( int short * ), ^?{}( volatile int short * ); 683 void ^?{}( int short unsigned * ), ^?{}( volatile int short unsigned * ); 684 void ^?{}( signed int * ), ^?{}( volatile signed int * ); 685 void ^?{}( unsigned int * ), ^?{}( volatile unsigned int * ); 686 void ^?{}( signed long int * ), ^?{}( volatile signed long int * ); 687 void ^?{}( unsigned long int * ), ^?{}( volatile unsigned long int * ); 688 void ^?{}( signed long long int * ), ^?{}( volatile signed long long int * ); 689 void ^?{}( unsigned long long int * ), ^?{}( volatile unsigned long long int * ); 690 void ^?{}( float * ), ^?{}( volatile float * ); 691 void ^?{}( double * ), ^?{}( volatile double * ); 692 void ^?{}( long double * ), ^?{}( volatile long double * ); 693 void ^?{}( float _Complex * ), ^?{}( volatile float _Complex * ); 694 void ^?{}( double _Complex * ), ^?{}( volatile double _Complex * ); 695 void ^?{}( long double _Complex * ), ^?{}( volatile long double _Complex * ); 696 696 697 697 // // default ctor … … 719 719 720 720 forall( dtype DT ) void ?{}( DT * *, DT * ); 721 forall( dtype DT ) void ?{}( DT * volatile *, DT * ); 721 722 forall( dtype DT ) void ?{}( const DT * *, DT * ); 723 forall( dtype DT ) void ?{}( const DT * volatile *, DT * ); 722 724 forall( dtype DT ) void ?{}( const DT * *, const DT * ); 725 forall( dtype DT ) void ?{}( const DT * volatile *, const DT * ); 723 726 forall( dtype DT ) void ?{}( volatile DT * *, DT * ); 727 forall( dtype DT ) void ?{}( volatile DT * volatile *, DT * ); 724 728 forall( dtype DT ) void ?{}( volatile DT * *, volatile DT * ); 729 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile DT * ); 725 730 726 731 forall( dtype DT ) void ?{}( const volatile DT * *, DT * ); 732 forall( dtype DT ) void ?{}( const volatile DT * volatile *, DT * ); 727 733 forall( dtype DT ) void ?{}( const volatile DT * *, const DT * ); 734 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const DT * ); 728 735 forall( dtype DT ) void ?{}( const volatile DT * *, volatile DT * ); 736 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile DT * ); 729 737 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile DT * ); 738 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile DT * ); 730 739 731 740 forall( dtype DT ) void ?{}( DT * *, void * ); 741 forall( dtype DT ) void ?{}( DT * volatile *, void * ); 732 742 forall( dtype DT ) void ?{}( const DT * *, void * ); 743 forall( dtype DT ) void ?{}( const DT * volatile *, void * ); 733 744 forall( dtype DT ) void ?{}( const DT * *, const void * ); 745 forall( dtype DT ) void ?{}( const DT * volatile *, const void * ); 734 746 forall( dtype DT ) void ?{}( volatile DT * *, void * ); 747 forall( dtype DT ) void ?{}( volatile DT * volatile *, void * ); 735 748 forall( dtype DT ) void ?{}( volatile DT * *, volatile void * ); 749 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile void * ); 736 750 737 751 forall( dtype DT ) void ?{}( const volatile DT * *, void * ); 752 forall( dtype DT ) void ?{}( const volatile DT * volatile *, void * ); 738 753 forall( dtype DT ) void ?{}( const volatile DT * *, const void * ); 754 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const void * ); 739 755 forall( dtype DT ) void ?{}( const volatile DT * *, volatile void * ); 756 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile void * ); 740 757 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile void * ); 758 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile void * ); 741 759 742 760 forall( dtype DT ) void ?{}( void * *, DT * ); 761 forall( dtype DT ) void ?{}( void * volatile *, DT * ); 743 762 forall( dtype DT ) void ?{}( const void * *, DT * ); 763 forall( dtype DT ) void ?{}( const void * volatile *, DT * ); 744 764 forall( dtype DT ) void ?{}( const void * *, const DT * ); 765 forall( dtype DT ) void ?{}( const void * volatile *, const DT * ); 745 766 forall( dtype DT ) void ?{}( volatile void * *, DT * ); 767 forall( dtype DT ) void ?{}( volatile void * volatile *, DT * ); 746 768 forall( dtype DT ) void ?{}( volatile void * *, volatile DT * ); 769 forall( dtype DT ) void ?{}( volatile void * volatile *, volatile DT * ); 747 770 forall( dtype DT ) void ?{}( const volatile void * *, DT * ); 771 forall( dtype DT ) void ?{}( const volatile void * volatile *, DT * ); 748 772 forall( dtype DT ) void ?{}( const volatile void * *, const DT * ); 773 forall( dtype DT ) void ?{}( const volatile void * volatile *, const DT * ); 749 774 forall( dtype DT ) void ?{}( const volatile void * *, volatile DT * ); 775 forall( dtype DT ) void ?{}( const volatile void * volatile *, volatile DT * ); 750 776 forall( dtype DT ) void ?{}( const volatile void * *, const volatile DT * ); 777 forall( dtype DT ) void ?{}( const volatile void * volatile *, const volatile DT * ); 751 778 752 779 void ?{}( void * *, void * ); 780 void ?{}( void * volatile *, void * ); 753 781 void ?{}( const void * *, void * ); 782 void ?{}( const void * volatile *, void * ); 754 783 void ?{}( const void * *, const void * ); 784 void ?{}( const void * volatile *, const void * ); 755 785 void ?{}( volatile void * *, void * ); 786 void ?{}( volatile void * volatile *, void * ); 756 787 void ?{}( volatile void * *, volatile void * ); 788 void ?{}( volatile void * volatile *, volatile void * ); 757 789 void ?{}( const volatile void * *, void * ); 790 void ?{}( const volatile void * volatile *, void * ); 758 791 void ?{}( const volatile void * *, const void * ); 792 void ?{}( const volatile void * volatile *, const void * ); 759 793 void ?{}( const volatile void * *, volatile void * ); 794 void ?{}( const volatile void * volatile *, volatile void * ); 760 795 void ?{}( const volatile void * *, const volatile void * ); 796 void ?{}( const volatile void * volatile *, const volatile void * ); 761 797 762 798 //forall( dtype DT ) void ?{}( DT * *, forall( dtype DT2 ) const DT2 * ); 763 799 //forall( dtype DT ) void ?{}( DT * volatile *, forall( dtype DT2 ) const DT2 * ); 764 800 forall( dtype DT ) void ?{}( const DT * *, forall( dtype DT2 ) const DT2 * ); 801 forall( dtype DT ) void ?{}( const DT * volatile *, forall( dtype DT2 ) const DT2 * ); 765 802 //forall( dtype DT ) void ?{}( volatile DT * *, forall( dtype DT2 ) const DT2 * ); 766 803 //forall( dtype DT ) void ?{}( volatile DT * volatile *, forall( dtype DT2 ) const DT2 * ); 767 804 forall( dtype DT ) void ?{}( const volatile DT * *, forall( dtype DT2 ) const DT2 * ); 805 forall( dtype DT ) void ?{}( const volatile DT * volatile *, forall( dtype DT2 ) const DT2 * ); 768 806 769 807 forall( ftype FT ) void ?{}( FT * *, forall( ftype FT2 ) FT2 * ); 808 forall( ftype FT ) void ?{}( FT * volatile *, forall( ftype FT2 ) FT2 * ); 770 809 771 810 // default ctors 772 811 forall( ftype FT ) void ?{}( FT * * ); 812 forall( ftype FT ) void ?{}( FT * volatile * ); 773 813 774 814 forall( dtype DT ) void ?{}( DT * *); 815 forall( dtype DT ) void ?{}( DT * volatile *); 775 816 forall( dtype DT ) void ?{}( const DT * *); 817 forall( dtype DT ) void ?{}( const DT * volatile *); 776 818 forall( dtype DT ) void ?{}( volatile DT * *); 819 forall( dtype DT ) void ?{}( volatile DT * volatile *); 777 820 forall( dtype DT ) void ?{}( const volatile DT * *); 821 forall( dtype DT ) void ?{}( const volatile DT * volatile *); 778 822 779 823 void ?{}( void * *); 824 void ?{}( void * volatile *); 780 825 void ?{}( const void * *); 826 void ?{}( const void * volatile *); 781 827 void ?{}( volatile void * *); 828 void ?{}( volatile void * volatile *); 782 829 void ?{}( const volatile void * *); 830 void ?{}( const volatile void * volatile *); 783 831 784 832 // dtors 785 833 forall( ftype FT ) void ^?{}( FT * * ); 834 forall( ftype FT ) void ^?{}( FT * volatile * ); 786 835 787 836 forall( dtype DT ) void ^?{}( DT * *); 837 forall( dtype DT ) void ^?{}( DT * volatile *); 788 838 forall( dtype DT ) void ^?{}( const DT * *); 839 forall( dtype DT ) void ^?{}( const DT * volatile *); 789 840 forall( dtype DT ) void ^?{}( volatile DT * *); 841 forall( dtype DT ) void ^?{}( volatile DT * volatile *); 790 842 forall( dtype DT ) void ^?{}( const volatile DT * *); 843 forall( dtype DT ) void ^?{}( const volatile DT * volatile *); 791 844 792 845 void ^?{}( void * *); 846 void ^?{}( void * volatile *); 793 847 void ^?{}( const void * *); 848 void ^?{}( const void * volatile *); 794 849 void ^?{}( volatile void * *); 850 void ^?{}( volatile void * volatile *); 795 851 void ^?{}( const volatile void * *); 852 void ^?{}( const volatile void * volatile *); 796 853 797 854 // Local Variables: // -
src/tests/.expect/declarationErrors.txt
radd7117 rf5e81d1 1 1 CFA Version 1.0.0 (debug) 2 Error: duplicate static in declaration of x1: static const volatile short int2 Error: invalid combination of storage classes in declaration of x9: static const volatile short int 3 3 4 Error: multiple extern & static in declaration of x2: extern const volatile short int 5 6 Error: multiple extern & auto, multiple extern & static, multiple extern & static, duplicate extern in declaration of x3: extern const volatile short int 7 8 Error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0 4 Error: invalid combination of storage classes in declaration of x18: static const volatile instance of const volatile struct __anonymous0 9 5 with members 10 6 with body 11 7 12 8 13 Error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous19 Error: duplicate qualifier volatile in declaration of x19: static const volatile instance of const volatile struct __anonymous1 14 10 with members 15 11 with body 16 12 17 13 18 Error: duplicate static in declaration of x6: static const volatile instance of type Int14 Error: invalid combination of storage classes in declaration of x28: static const volatile instance of type Int 19 15 20 Error: duplicate const in declaration of f01: static inline function16 Error: duplicate qualifier const in declaration of f01: static inline function 21 17 with no parameters 22 18 returning const volatile int 23 19 24 20 25 Error: duplicate volatile in declaration of f02: static inline function21 Error: duplicate qualifier volatile in declaration of f02: static inline function 26 22 with no parameters 27 23 returning const volatile int 28 24 29 25 30 Error: duplicate const in declaration of f03: static inline function26 Error: duplicate qualifier const in declaration of f03: static inline function 31 27 with no parameters 32 28 returning const volatile int 33 29 34 30 35 Error: duplicate volatile in declaration of f04: static inline function31 Error: duplicate qualifier volatile in declaration of f04: static inline function 36 32 with no parameters 37 33 returning const volatile int 38 34 39 35 40 Error: duplicate const in declaration of f05: static inline function36 Error: duplicate qualifier const in declaration of f05: static inline function 41 37 with no parameters 42 38 returning const volatile int 43 39 44 40 45 Error: duplicate volatile in declaration of f06: static inline function41 Error: duplicate qualifier volatile in declaration of f06: static inline function 46 42 with no parameters 47 43 returning const volatile int 48 44 49 45 50 Error: duplicate const in declaration of f07: static inline function46 Error: duplicate qualifier const in declaration of f07: static inline function 51 47 with no parameters 52 48 returning const volatile int 53 49 54 50 55 Error: duplicate const, duplicatevolatile in declaration of f08: static inline function51 Error: duplicate qualifier const, volatile in declaration of f08: static inline function 56 52 with no parameters 57 53 returning const volatile int 58 54 59 55 60 Error: duplicate const, duplicatevolatile in declaration of f09: static inline function56 Error: duplicate qualifier const, volatile in declaration of f09: static inline function 61 57 with no parameters 62 58 returning const volatile int 63 59 64 60 65 Error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicatevolatile in declaration of f09: static inline function61 Error: duplicate qualifier const, volatile in declaration of f09: static inline function 66 62 with no parameters 67 returning const restrict volatile _Atomicint63 returning const volatile int 68 64 69 65 -
src/tests/declarationErrors.c
radd7117 rf5e81d1 10 10 // Created On : Wed Aug 17 08:23:43 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 9 22:57:52201613 // Update Count : 3112 // Last Modified On : Thu Aug 25 18:16:40 2016 13 // Update Count : 5 14 14 // 15 15 16 static short int volatile static const x1; // duplicate static 17 extern short int static volatile const x2; // multiple extern & static 18 extern short int auto static volatile static extern const x3; // duplicate and multiple storage classes 19 struct { int i; } const static volatile static x4; // duplicate static 20 struct { int i; } const static volatile const static volatile x5; // duplicate static & const & volatile 16 static short int volatile static const x9; // duplicate static 17 struct { int i; } const static volatile static x18; // duplicate static 18 struct { int i; } const static volatile static volatile x19; // duplicate static & volatile 21 19 typedef int Int; 22 static Int volatile static const x 6; // duplicate static20 static Int volatile static const x28; // duplicate static 23 21 24 22 const static inline const volatile int f01(); // duplicate const … … 26 24 const inline const volatile int static f03(); // duplicate const 27 25 volatile inline static const volatile int f04(); // duplicate volatile 28 const static int const inline volatilef05(); // duplicate const29 volatile int static const volatile inlinef06(); // duplicate volatile30 const static const int volatileinline f07(); // duplicate const31 volatile static const int inline const volatile f08(); // duplicate volatile26 const static const inline volatile int f05(); // duplicate const 27 volatile static const volatile inline int f06(); // duplicate volatile 28 const static const volatile int inline f07(); // duplicate const 29 volatile static const int inline const volatile f08(); // duplicate volatile 32 30 33 volatile static const int inline const volatile f09(); // duplicate volatile34 _Atomic _Atomic _Atomic volatile restrict static const const int inline restrict const volatile f09();// duplicate volatile31 volatile static const int inline const volatile f09(); // duplicate volatile 32 volatile static const int inline const volatile f09(); // duplicate volatile 35 33 36 34 //Dummy main -
src/tests/test.py
radd7117 rf5e81d1 285 285 # check if the user already passed in a number of jobs for multi-threading 286 286 make_flags = environ.get('MAKEFLAGS') 287 make_jobs_fds = re.search("--jobserver-fds=\s*([0-9]+),([0-9]+)", make_flags) if make_flags else None 288 if make_jobs_fds : 289 tokens = os.read(int(make_jobs_fds.group(1)), 1024) 290 options.jobs = len(tokens) 291 os.write(int(make_jobs_fds.group(2)), tokens) 287 make_has_max_jobs = re.search("(-j|--jobs)\s*([0-9]+)", make_flags) if make_flags else None 288 make_max_jobs = make_has_max_jobs.group(2) if make_has_max_jobs else None 289 make_cmd = "make" if make_flags and "-j" in make_flags else "make -j8" 292 290 293 291 # make sure we have a valid number of jobs that corresponds to user input 292 options.jobs = int(make_max_jobs) if make_max_jobs else (options.jobs if options.jobs else 1) 294 293 if options.jobs <= 0 : 295 294 print('ERROR: Invalid number of jobs', file=sys.stderr) … … 297 296 298 297 print('Running on %i cores' % options.jobs) 299 make_cmd = "make" if make_flags else ("make -j%i" % options.jobs)300 298 301 299 # users may want to simply list the tests
Note:
See TracChangeset
for help on using the changeset viewer.