- Timestamp:
- Jul 6, 2018, 2:18:34 PM (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, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- 46e480a5
- Parents:
- e3b2474 (diff), 1d386a7 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 1 added
- 5 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
re3b2474 r638ac26 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jun 7 12:08:55201813 // Update Count : 10 7912 // Last Modified On : Fri Jul 6 06:56:08 2018 13 // Update Count : 1088 14 14 // 15 15 … … 522 522 523 523 static void addQualifiersToType( TypeData *&src, TypeData * dst ) { 524 if ( src->forall && dst->kind == TypeData::Function ) {525 if ( dst->forall ) {526 dst->forall->appendList( src->forall );527 } else {528 dst->forall = src->forall;529 } // if530 src->forall = nullptr;531 } // if532 524 if ( dst->base ) { 533 525 addQualifiersToType( src, dst->base ); … … 1083 1075 SemanticError( this, "invalid function specifier for " ); 1084 1076 } // if 1077 // Forall qualifier can only appear on a function/aggregate definition/declaration. 1078 // 1079 // forall int f(); // allowed 1080 // forall int g( int i ); // allowed 1081 // forall int i; // disallowed 1082 if ( type->kind != TypeData::Function && type->forall ) { 1083 SemanticError( this, "invalid type qualifier for " ); 1084 } // if 1085 1085 bool isDelete = initializer && initializer->get_isDelete(); 1086 1086 Declaration * decl = buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, isDelete ? nullptr : maybeBuild< Initializer >(initializer), attributes )->set_extension( extension ); -
src/Parser/parser.yy
re3b2474 r638ac26 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 2 20:23:14201813 // Update Count : 3 60712 // Last Modified On : Fri Jul 6 08:02:38 2018 13 // Update Count : 3716 14 14 // 15 15 … … 116 116 117 117 void distQual( DeclarationNode * declaration, DeclarationNode * qualifiers ) { 118 // distribute qualifiers across all declarations in a distribution statemement118 // distribute qualifiers across all non-variable declarations in a distribution statemement 119 119 for ( DeclarationNode * iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) { 120 if ( isMangled( iter->linkage ) ) { // ignore extern "C" 121 iter->addQualifiers( qualifiers->clone() ); 120 // SKULLDUGGERY: Distributions are parsed inside out, so qualifiers are added to declarations inside out. Since 121 // addQualifiers appends to the back of the list, the forall clauses are in the wrong order (right to left). To 122 // get the qualifiers in the correct order and still use addQualifiers (otherwise, 90% of addQualifiers has to 123 // be copied to add to front), the appropriate forall pointers are interchanged before calling addQualifiers. 124 DeclarationNode * clone = qualifiers->clone(); 125 if ( qualifiers->type ) { // forall clause ? (handles SC) 126 if ( iter->type->kind == TypeData::Aggregate ) { // struct/union ? 127 swap( clone->type->forall, iter->type->aggregate.params ); 128 iter->addQualifiers( clone ); 129 } else if ( iter->type->kind == TypeData::AggregateInst && iter->type->aggInst.aggregate->aggregate.body ) { // struct/union ? 130 // Create temporary node to hold aggregate, call addQualifiers as above, then put nodes back together. 131 DeclarationNode newnode; 132 swap( newnode.type, iter->type->aggInst.aggregate ); 133 swap( clone->type->forall, newnode.type->aggregate.params ); 134 newnode.addQualifiers( clone ); 135 swap( newnode.type, iter->type->aggInst.aggregate ); 136 } else if ( iter->type->kind == TypeData::Function ) { // routines ? 137 swap( clone->type->forall, iter->type->forall ); 138 iter->addQualifiers( clone ); 139 } // if 140 } else { // just SC qualifiers 141 iter->addQualifiers( clone ); 122 142 } // if 123 143 } // for 124 } // distExt 144 delete qualifiers; 145 } // distQual 125 146 126 147 // There is an ambiguity for inline generic-routine return-types and generic routines. … … 366 387 %type<decl> type_parameter type_parameter_list type_initializer_opt 367 388 368 %type<en> type_ list389 %type<en> type_parameters_opt type_list 369 390 370 391 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list … … 406 427 // Order of these lines matters (low-to-high precedence). 407 428 %precedence TYPEGENname 429 %precedence '}' 408 430 %precedence '(' 409 431 … … 1753 1775 { $$ = $3->addQualifiers( $1 ); } 1754 1776 | sue_type_specifier type_qualifier 1755 { $$ = $1->addQualifiers( $2 ); } 1777 { 1778 if ( $2->type != nullptr && $2->type->forall ) forall = true; // remember generic type 1779 $$ = $1->addQualifiers( $2 ); 1780 } 1756 1781 ; 1757 1782 … … 1831 1856 1832 1857 aggregate_type: // struct, union 1833 aggregate_key attribute_list_opt '{' field_declaration_list_opt '}' 1834 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), nullptr, $4, true )->addQualifiers( $2 ); }1858 aggregate_key attribute_list_opt '{' field_declaration_list_opt '}' type_parameters_opt 1859 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $6, $4, true )->addQualifiers( $2 ); } 1835 1860 | aggregate_key attribute_list_opt no_attr_identifier fred 1836 1861 { … … 1838 1863 forall = false; // reset 1839 1864 } 1840 '{' field_declaration_list_opt '}' 1841 { $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $7, true )->addQualifiers( $2 ); }1865 '{' field_declaration_list_opt '}' type_parameters_opt 1866 { $$ = DeclarationNode::newAggregate( $1, $3, $9, $7, true )->addQualifiers( $2 ); } 1842 1867 | aggregate_key attribute_list_opt type_name fred 1843 1868 { … … 1845 1870 forall = false; // reset 1846 1871 } 1847 '{' field_declaration_list_opt '}' 1848 { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, nullptr, $7, true )->addQualifiers( $2 ); } 1849 | aggregate_key attribute_list_opt '(' type_list ')' '{' field_declaration_list_opt '}' // CFA 1850 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $4, $7, false )->addQualifiers( $2 ); } 1872 '{' field_declaration_list_opt '}' type_parameters_opt 1873 { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, $9, $7, true )->addQualifiers( $2 ); } 1851 1874 | aggregate_type_nobody 1875 ; 1876 1877 type_parameters_opt: 1878 // empty 1879 { $$ = nullptr; } %prec '}' 1880 | '(' type_list ')' 1881 { $$ = $2; } 1852 1882 ; 1853 1883 … … 2386 2416 distQual( $5, $1 ); 2387 2417 xxx = false; 2388 delete $1;2389 2418 $$ = $5; 2390 2419 } … … 2398 2427 distQual( $5, $1 ); 2399 2428 xxx = false; 2400 delete $1;2401 2429 $$ = $5; 2402 2430 } … … 2408 2436 '{' up external_definition_list_opt down '}' // CFA, namespace 2409 2437 { 2410 distQual( $6, $2 ); 2411 distQual( $6, $1 ); 2438 distQual( $6, $1->addQualifiers( $2 ) ); 2412 2439 xxx = false; 2413 delete $1;2414 delete $2;2415 2440 $$ = $6; 2416 2441 } -
src/libcfa/stdlib
re3b2474 r638ac26 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Jul 3 08:17:28201813 // Update Count : 3 2412 // Last Modified On : Thu Jul 5 07:41:03 2018 13 // Update Count : 332 14 14 // 15 15 … … 18 18 #include <stdlib.h> // allocation, strto*, *abs 19 19 extern "C" { 20 void * memalign( size_t align, size_t size ); 21 void * aligned_alloc( size_t align, size_t size );22 void * mem set( void * dest, int c, size_t size );20 void * memalign( size_t align, size_t size ); // malloc.h 21 void * memset( void * dest, int c, size_t size ); // string.h 22 void * memcpy( void * dest, const void * src, size_t size ); // string.h 23 23 } // extern "C" 24 24 … … 140 140 } // memset 141 141 142 extern "C" { void * memcpy( void * dest, const void * src, size_t size ); } // use default C routine for void *143 144 142 T * memcpy( T * dest, const T * src ) { 145 143 //printf( "X18\n" ); … … 174 172 //--------------------------------------- 175 173 176 static inline int strto( const char * sptr, char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); } 177 static inline unsigned int strto( const char * sptr, char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); } 178 static inline long int strto( const char * sptr, char ** eptr, int base ) { return strtol( sptr, eptr, base ); } 179 static inline unsigned long int strto( const char * sptr, char ** eptr, int base ) { return strtoul( sptr, eptr, base ); } 180 static inline long long int strto( const char * sptr, char ** eptr, int base ) { return strtoll( sptr, eptr, base ); } 181 static inline unsigned long long int strto( const char * sptr, char ** eptr, int base ) { return strtoull( sptr, eptr, base ); } 182 183 static inline float strto( const char * sptr, char ** eptr ) { return strtof( sptr, eptr ); } 184 static inline double strto( const char * sptr, char ** eptr ) { return strtod( sptr, eptr ); } 185 static inline long double strto( const char * sptr, char ** eptr ) { return strtold( sptr, eptr ); } 174 static inline { 175 int strto( const char * sptr, char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); } 176 unsigned int strto( const char * sptr, char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); } 177 long int strto( const char * sptr, char ** eptr, int base ) { return strtol( sptr, eptr, base ); } 178 unsigned long int strto( const char * sptr, char ** eptr, int base ) { return strtoul( sptr, eptr, base ); } 179 long long int strto( const char * sptr, char ** eptr, int base ) { return strtoll( sptr, eptr, base ); } 180 unsigned long long int strto( const char * sptr, char ** eptr, int base ) { return strtoull( sptr, eptr, base ); } 181 182 float strto( const char * sptr, char ** eptr ) { return strtof( sptr, eptr ); } 183 double strto( const char * sptr, char ** eptr ) { return strtod( sptr, eptr ); } 184 long double strto( const char * sptr, char ** eptr ) { return strtold( sptr, eptr ); } 185 } // distribution 186 186 187 187 float _Complex strto( const char * sptr, char ** eptr ); … … 189 189 long double _Complex strto( const char * sptr, char ** eptr ); 190 190 191 static inline int ato( const char * sptr ) {return (int)strtol( sptr, 0, 10 ); } 192 static inline unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0, 10 ); } 193 static inline long int ato( const char * sptr ) { return strtol( sptr, 0, 10 ); } 194 static inline unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0, 10 ); } 195 static inline long long int ato( const char * sptr ) { return strtoll( sptr, 0, 10 ); } 196 static inline unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0, 10 ); } 197 198 static inline float ato( const char * sptr ) { return strtof( sptr, 0 ); } 199 static inline double ato( const char * sptr ) { return strtod( sptr, 0 ); } 200 static inline long double ato( const char * sptr ) { return strtold( sptr, 0 ); } 201 202 static inline float _Complex ato( const char * sptr ) { return strto( sptr, NULL ); } 203 static inline double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); } 204 static inline long double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); } 191 static inline { 192 int ato( const char * sptr ) {return (int)strtol( sptr, 0, 10 ); } 193 unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0, 10 ); } 194 long int ato( const char * sptr ) { return strtol( sptr, 0, 10 ); } 195 unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0, 10 ); } 196 long long int ato( const char * sptr ) { return strtoll( sptr, 0, 10 ); } 197 unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0, 10 ); } 198 199 float ato( const char * sptr ) { return strtof( sptr, 0 ); } 200 double ato( const char * sptr ) { return strtod( sptr, 0 ); } 201 long double ato( const char * sptr ) { return strtold( sptr, 0 ); } 202 203 float _Complex ato( const char * sptr ) { return strto( sptr, NULL ); } 204 double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); } 205 long double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); } 206 } // distribution 205 207 206 208 //--------------------------------------- … … 236 238 //--------------------------------------- 237 239 238 static inline unsigned char abs( signed char v ) { return abs( (int)v ); }239 240 extern "C" { int abs( int ); } // use default C routine for int 240 static inline unsigned long int abs( long int v ) { return labs( v ); } 241 static inline unsigned long long int abs( long long int v ) { return llabs( v ); } 242 243 extern "C" { 244 double fabs( double ); 245 float fabsf( float ); 246 long double fabsl( long double ); 241 static inline { 242 unsigned char abs( signed char v ) { return abs( (int)v ); } 243 unsigned long int abs( long int v ) { return labs( v ); } 244 unsigned long long int abs( long long int v ) { return llabs( v ); } 245 } // distribution 246 247 extern "C" { // use default C routine for int 248 double fabs( double ); 249 float fabsf( float ); 250 long double fabsl( long double ); 247 251 } // extern "C" 248 static inline float abs( float x ) { return fabsf( x ); } 249 static inline double abs( double x ) { return fabs( x ); } 250 static inline long double abs( long double x ) { return fabsl( x ); } 251 252 extern "C" { 253 double cabs( double _Complex ); 254 float cabsf( float _Complex ); 255 long double cabsl( long double _Complex ); 252 static inline { 253 float abs( float x ) { return fabsf( x ); } 254 double abs( double x ) { return fabs( x ); } 255 long double abs( long double x ) { return fabsl( x ); } 256 } // distribution 257 258 extern "C" { // use default C routine for int 259 double cabs( double _Complex ); 260 float cabsf( float _Complex ); 261 long double cabsl( long double _Complex ); 256 262 } // extern "C" 257 static inline float abs( float _Complex x ) { return cabsf( x ); } 258 static inline double abs( double _Complex x ) { return cabs( x ); } 259 static inline long double abs( long double _Complex x ) { return cabsl( x ); } 263 static inline { 264 float abs( float _Complex x ) { return cabsf( x ); } 265 double abs( double _Complex x ) { return cabs( x ); } 266 long double abs( long double _Complex x ) { return cabsl( x ); } 267 } // distribution 260 268 261 269 forall( otype T | { void ?{}( T &, zero_t ); int ?<?( T, T ); T -?( T ); } ) … … 295 303 //--------------------------------------- 296 304 297 forall( otype T | { int ?<?( T, T ); } ) 298 static inline T min( T t1, T t2 ) { return t1 < t2 ? t1 : t2; } 299 300 forall( otype T | { int ?>?( T, T ); } ) 301 static inline T max( T t1, T t2 ) { return t1 > t2 ? t1 : t2; } 302 303 forall( otype T | { T min( T, T ); T max( T, T ); } ) 304 static inline T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); } 305 306 forall( otype T ) 307 static inline void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; } 305 static inline { 306 forall( otype T | { int ?<?( T, T ); } ) 307 T min( T t1, T t2 ) { return t1 < t2 ? t1 : t2; } 308 309 forall( otype T | { int ?>?( T, T ); } ) 310 T max( T t1, T t2 ) { return t1 > t2 ? t1 : t2; } 311 312 forall( otype T | { T min( T, T ); T max( T, T ); } ) 313 T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); } 314 315 forall( otype T ) 316 void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; } 317 } // distribution 308 318 309 319 // Local Variables: // -
src/prelude/Makefile.am
re3b2474 r638ac26 42 42 ${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -E prototypes.c | awk -f prototypes.awk > $@ 43 43 44 prelude.cf : prelude-gen.cc 45 ${AM_V_GEN}${CXX} ${AM_CXXFLAGS} ${CXXFLAGS} ${<} -o prelude-gen 46 @./prelude-gen > $@ 47 @rm ./prelude-gen 48 44 49 builtins.def : 45 50 -
src/prelude/Makefile.in
re3b2474 r638ac26 511 511 ${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -E prototypes.c | awk -f prototypes.awk > $@ 512 512 513 prelude.cf : prelude-gen.cc 514 ${AM_V_GEN}${CXX} ${AM_CXXFLAGS} ${CXXFLAGS} ${<} -o prelude-gen 515 @./prelude-gen > $@ 516 @rm ./prelude-gen 517 513 518 builtins.def : 514 519
Note: See TracChangeset
for help on using the changeset viewer.