Changes in / [7f2bfb7:4f1b2d69]
- Files:
-
- 17 edited
-
.gitignore (modified) (2 diffs)
-
configure.ac (modified) (2 diffs)
-
doc/proposals/enum.tex (modified) (7 diffs)
-
src/AST/Decl.cpp (modified) (1 diff)
-
src/AST/Decl.hpp (modified) (1 diff)
-
src/Concurrency/Actors.cpp (modified) (6 diffs)
-
src/Concurrency/Corun.cpp (modified) (2 diffs)
-
src/Concurrency/KeywordsNew.cpp (modified) (4 diffs)
-
src/Concurrency/Waituntil.cpp (modified) (2 diffs)
-
src/ControlStruct/ExceptTranslateNew.cpp (modified) (5 diffs)
-
src/InitTweak/FixGlobalInit.cc (modified) (2 diffs)
-
src/InitTweak/FixInitNew.cpp (modified) (2 diffs)
-
src/InitTweak/InitTweak.cc (modified) (1 diff)
-
src/Makefile.am (modified) (1 diff)
-
src/ResolvExpr/CurrentObject.cc (modified) (2 diffs)
-
src/Virtual/Tables.cc (modified) (1 diff)
-
src/Virtual/VirtualDtor.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r7f2bfb7 r4f1b2d69 39 39 driver/cfa-cpp 40 40 driver/cc1 41 driver/demangler42 41 43 42 libcfa/prelude/bootloader.c … … 60 59 src/Parser/parser.h 61 60 src/Parser/parser.hh 61 src/demangler 62 62 63 63 tools/prettyprinter/parser.output -
configure.ac
r7f2bfb7 r4f1b2d69 244 244 if test "x$enable_demangler" == xyes; then 245 245 LIBDEMANGLE="libdemangle.a" 246 DEMANGLER=" ../driver/demangler"246 DEMANGLER="demangler" 247 247 else 248 248 LIBDEMANGLE="" … … 273 273 libcfa/Makefile:libcfa/Makefile.dist.in 274 274 tests/Makefile 275 ])275 ]) 276 276 277 277 # Some of our makefile don't need to be distributed -
doc/proposals/enum.tex
r7f2bfb7 r4f1b2d69 289 289 \end{lstlisting} 290 290 291 %\subsection{Runtime Enumeration}292 293 %The companion structure definition is visible to users, and users can create an instance of companion object themselves, which effectively constructs a \textit{Runtime Enumeration}.294 %\begin{lstlisting}[ label=lst:runtime_enum ]295 %const char values[$\,$] = { "Hello", "World" };296 %const char labels[$\,$] = { "First", "Second" };297 %Companion(char *) MyEnum = { .values: values, .labels: labels, .length: 2 };298 %\end{lstlisting}299 %A runtime enumeration can be used to call enumeration functions.300 %\begin{lstlisting}[ label=lst:runtime_enum_usage ]301 %sout | charatstic_string( MyEnum, 1 );302 %>>> Label: Second; Value: World303 %\end{lstlisting}304 %However, a runtime enumeration cannot create an enumeration instance, and it does not support enum-qualified syntax.305 %\begin{lstlisting}[ label=lst:runtime_enum_usage ]306 %MyEnum e = MyEnum.First; // Does not work: cannot create an enumeration instance e,307 %// and MyEnum.First is not recognizable308 %\end{lstlisting}309 %During the compilation, \CFA adds enumeration declarations to an enumeration symbol table and creates specialized function definitions for \CFA enumeration.310 %\CFA does not recognize runtime enumeration during compilation and would not add them to the enumeration symbol table, resulting in a lack of supports for runtime enumeration.311 312 %\PAB{Not sure how useful this feature is.}313 314 %\section{Enumeration Features}291 \subsection{Runtime Enumeration} 292 293 The companion structure definition is visible to users, and users can create an instance of companion object themselves, which effectively constructs a \textit{Runtime Enumeration}. 294 \begin{lstlisting}[ label=lst:runtime_enum ] 295 const char values[$\,$] = { "Hello", "World" }; 296 const char labels[$\,$] = { "First", "Second" }; 297 Companion(char *) MyEnum = { .values: values, .labels: labels, .length: 2 }; 298 \end{lstlisting} 299 A runtime enumeration can be used to call enumeration functions. 300 \begin{lstlisting}[ label=lst:runtime_enum_usage ] 301 sout | charatstic_string( MyEnum, 1 ); 302 >>> Label: Second; Value: World 303 \end{lstlisting} 304 However, a runtime enumeration cannot create an enumeration instance, and it does not support enum-qualified syntax. 305 \begin{lstlisting}[ label=lst:runtime_enum_usage ] 306 MyEnum e = MyEnum.First; // Does not work: cannot create an enumeration instance e, 307 // and MyEnum.First is not recognizable 308 \end{lstlisting} 309 During the compilation, \CFA adds enumeration declarations to an enumeration symbol table and creates specialized function definitions for \CFA enumeration. 310 \CFA does not recognize runtime enumeration during compilation and would not add them to the enumeration symbol table, resulting in a lack of supports for runtime enumeration. 311 312 \PAB{Not sure how useful this feature is.} 313 314 \section{Enumeration Features} 315 315 316 316 A trait is a collection of constraints in \CFA that can be used to describe types. 317 317 The \CFA standard library defines traits to categorize types with related enumeration features. 318 318 319 \section{Enumerator Initialization}320 An enumerator must have a deterministic immutable value, either be explicitly initialized in the enumeration definition, or implicitly initialized by rules.321 322 \subsection{C Enumeration Rule}323 A C enumeration has an integral type. If not initialized, the first enumerator implicitly has the integral value 0, and other enumerators have a value equal to its $predecessor + 1$.324 325 319 \subsection{Auto Initializable} 326 320 \label{s:AutoInitializable} 327 321 328 322 TODO: make the initialization rule a separate section. 323 324 If no explicit initializer is given to an enumeration constant, C initializes the first enumeration constant with value 0, and the next enumeration constant has a value equal to its $predecessor + 1$. 329 325 \CFA enumerations have the same rule in enumeration constant initialization. 330 326 However, only \CFA types that have defined traits for @zero_t@, @one_t@, and an addition operator can be automatically initialized by \CFA. … … 360 356 }; 361 357 \end{lstlisting} 362 Note thatthere is no mechanism to prevent an even value for the direct initialization, such as @C = 6@.358 Note, there is no mechanism to prevent an even value for the direct initialization, such as @C = 6@. 363 359 364 360 In \CFA, character, integral, float, and imaginary types are all @AutoInitialiable@. … … 371 367 >>> F, o, z 372 368 \end{lstlisting} 373 \section{Enumeration Features} 369 374 370 \subsection{Iteration and Range} 375 371 376 It is convenient to iterate over a \CFA enumeration value, e.g.:372 It is convenient to iterate over a \CFA enumeration, e.g.: 377 373 \begin{lstlisting}[label=lst:range_functions] 378 for ( Alphabet alph; Alphabet ) { sout | alph; } 379 >>> A B C ... D 374 for ( Alphabet alph; Alphabet ) { 375 printf( "%d ", alph ); 376 } 377 >>> A B C ... 380 378 \end{lstlisting} 381 379 The for-loop uses the enumeration type @Alphabet@ its range, and iterates through all enumerators in the order defined in the enumeration. 382 380 @alph@ is the iterating enumeration object, which returns the value of an @Alphabet@ in this context according to the precedence rule. 383 381 384 \ textbullet\ \CFA offers a shorthand for iterating all enumeration constants:382 \CFA offers a shorthand for iterating all enumeration constants: 385 383 \begin{lstlisting}[label=lst:range_functions] 386 for ( Alphabet alph ) { sout | alph; } 387 >>> A B C ... D 388 \end{lstlisting} 389 390 The following are examples for constructing for-control using an enumeration. Note that the type declaration of the iterating variable is optional, because \CFA can infer the type as EnumInstType based on the range expression, and possibly convert it to one of its attribute types. 391 392 \textbullet\ H is implicit up-to exclusive range [0, H). 393 \begin{lstlisting}[label=lst:range_function_1] 394 for ( alph; Alphabet.D ) { sout | alph; } 395 >>> A B C 396 \end{lstlisting} 397 398 \textbullet\ ~= H is implicit up-to inclusive range [0,H]. 399 \begin{lstlisting}[label=lst:range_function_2] 400 for ( alph; ~= Alphabet.D ) { sout | alph; } 401 >>> A B C D 402 \end{lstlisting} 403 404 \textbullet\ L ~ H is explicit up-to exclusive range [L,H). 405 \begin{lstlisting}[label=lst:range_function_3] 406 for ( alph; Alphabet.B ~ Alphabet.D ) { sout | alph; } 407 // for ( Alphabet alph = Alphabet.B; alph < Alphabet.D; alph += 1 ); 1 is one_t 408 >>> B C 409 \end{lstlisting} 410 411 \textbullet\ L ~= H is explicit up-to inclusive range [L,H]. 412 \begin{lstlisting}[label=lst:range_function_4] 413 for ( alph; Alphabet.B ~= Alphabet.D ) { sout | alph; } 414 >>> B C D 415 \end{lstlisting} 416 417 \textbullet\ L -~ H is explicit down-to exclusive range [H,L), where L and H are implicitly interchanged to make the range down-to. 418 \begin{lstlisting}[label=lst:range_function_5] 419 for ( alph; Alphabet.D -~ Alphabet.B ) { sout | alph; } 420 >>> D C 421 \end{lstlisting} 422 423 \textbullet\ L -~= H is explicit down-to exclusive range [H,L], where L and H are implicitly interchanged to make the range down-to. 424 \begin{lstlisting}[label=lst:range_function_6] 425 for ( alph; Alphabet.D -~= Alphabet.B ) { sout | alph; } 426 >>> D C B 427 \end{lstlisting} 428 429 A user can specify the ``step size'' of an iteration. There are two different stepping schemes of enumeration for-loop. 430 \begin{lstlisting}[label=lst:range_function_stepping] 431 enum(int) Sequence { A = 10, B = 12, C = 14, D = 16, D = 18 }; 432 for ( s; Sequence.A ~= Sequence.D ~ 1 ) { sout | alph; } 433 >>> 10 12 14 16 18 434 for ( s; Sequence.A ~= Sequence.D; s+=1 ) { sout | alph; } 435 >>> 10 11 12 13 14 15 16 17 18 436 \end{lstlisting} 437 The first syntax is stepping to the next enumeration constant, which is the default stepping scheme if not explicitly specified. The second syntax, on the other hand, is to call @operator+=@ @one_type@ on the @value( s )@. Therefore, the second syntax is equivalent to 438 \begin{lstlisting}[label=lst:range_function_stepping_converted] 439 for ( typeof( value(Sequence.A) ) s=value( Sequence.A ); s <= Sequence.D; s+=1 ) { sout | alph; } 440 >>> 10 11 12 13 14 15 16 17 18 441 \end{lstlisting} 442 443 % \PAB{Explain what each loop does.} 384 for ( Alphabet alph ) { 385 printf( "%d ", alph ); 386 } 387 >>> A B C ... 388 \end{lstlisting} 389 The following different loop-control syntax is supported: 390 \begin{lstlisting}[label=lst:range_functions] 391 for ( Alphabet.D ) 392 for ( alph; Alphabet.g ~ Alphabet.z ) 393 for ( Alphabet alph; Alphabet.R ~ Alphabet.X ~ 2 ) 394 \end{lstlisting} 395 \PAB{Explain what each loop does.} 396 Notably, the meaning of ``step'' for an iteration has changed for enumeration. 397 Consider the following example: 398 \begin{lstlisting}[label=lst:range_functions] 399 enum(int) Sequence { 400 A = 10, B = 12, C = 14; 401 } 402 for ( s; Sequence.A ~ Sequence.C ) { 403 printf( "%d ", s ); 404 } 405 >>> 10 12 14 406 407 for ( s; Sequence.A ~ Sequence.A ~ 2 ) { 408 printf( "%d ", s ); 409 } 410 >>> 10 14 411 \end{lstlisting} 412 The range iteration of enumeration does not return the @current_value++@ until it reaches the upper bound. 413 The semantics is to return the next enumeration constant. 414 If a stepping is specified, 2 for example, it returns the 2 enumeration constant after the current one, rather than the @current+2@. 444 415 445 416 It is also possible to iterate over an enumeration's labels, implicitly or explicitly: … … 453 424 \end{lstlisting} 454 425 455 456 % \subsection{Non-uniform Type}457 % TODO: Working in Progress, might need to change other sections. Conflict with the resolution right now.458 459 % \begin{lstlisting}460 % enum T( int, char * ) {461 % a=42, b="Hello World"462 % };463 % \end{lstlisting}464 % The enum T declares two different types: int and char *. The enumerators of T hold values of one of the declared types.465 466 \subsection{Enumeration Inheritance}467 468 \begin{lstlisting}[label=lst:EnumInline]469 enum( char * ) Name { Jack = "Jack", Jill = "Jill" };470 enum /* inferred */ Name2 { inline Name, Sue = "Sue", Tom = "Tom" };471 \end{lstlisting}472 \lstinline{Inline} allows Enumeration Name2 to inherit enumerators from Name1 by containment, and a Name enumeration is a subtype of enumeration Name2. An enumeration instance of type Name can be used where an instance of Name2 is expected.473 \begin{lstlisting}[label=lst:EnumInline]474 Name Fred;475 void f( Name2 );476 f( Fred );477 \end{lstlisting}478 If enumeration A declares @inline B@ in its enumeration body, enumeration A is the "inlining enum" and enumeration B is the "inlined enum".479 480 An enumeration can inline at most one other enumeration. The inline declaration must be placed before the first enumerator of the inlining enum. The inlining enum has all the enumerators from the inlined enum, with the same labels, values, and position.481 \begin{lstlisting}[label=lst:EnumInline]482 enum /* inferred */ Name2 { inline Name, Sue = "Sue", Tom = "Tom" };483 // is equivalent to enum Name2 { Jack = "Jack", Jill="Jill", Sue = "Sue", Tom = "Tom" };484 \end{lstlisting}485 Name.Jack is equivalent to Name2.Jack. Their attributes are all identical. Opening both Name and Name2 in the same scope will not introduce ambiguity.486 \begin{lstlisting}[label=lst:EnumInline]487 with( Name, Name2 ) { Jack; } // Name.Jack and Name2.Jack are equivalent. No ambiguity488 \end{lstlisting}489 490 426 \section{Implementation} 491 427 492 \subsection{Compiler Representation} 493 The definition of an enumeration is represented by an internal type called @EnumDecl@. At the minimum, it stores all the information needed to construct the companion object. Therefore, an @EnumDecl@ can be represented as the following: 494 \begin{lstlisting}[label=lst:EnumDecl] 495 forall(T) 496 class EnumDecl { 497 T* values; 498 char** label; 499 }; 500 \end{lstlisting} 501 502 The internal representation of an enumeration constant is @EnumInstType@. 503 An @EnumInstType@ has a reference to the \CFA-enumeration declaration and the position of the enumeration constant. 504 \begin{lstlisting}[label=lst:EnumInstType] 505 class EnumInstType { 506 EnumDecl enumDecl; 507 int position; 508 }; 509 \end{lstlisting} 510 In the later discussion, we will use @EnumDecl<T>@ to symbolize a @EnumDecl@ parameterized by type T, and @EnumInstType<T>@ is a declared instance of @EnumDecl<T>@. 511 512 % \subsection{Preluede} 513 % \CFA places the definition of Companion structure and non-parameterized Companion functions in the prelude, visible globally. 428 \CFA places the definition of Companion structure and non-parameterized Companion functions in the prelude, visible globally. 514 429 515 430 \subsection{Declaration} … … 564 479 If the @aggregation_name@ is identified as a \CFA enumeration, the compiler checks if @field@ presents in the declared \CFA enumeration. 565 480 566 \subsection{\lstinline{with} Clause/Statement} 481 \subsection{\lstinline{with} Statement} 482 483 \emph{Work in Progress} 484 567 485 Instead of qualifying an enumeration expression every time, the @with@ can be used to expose enumerators to the current scope, making them directly accessible. 486 487 \subsection{Instance Declaration} 488 489 \emph{Work in Progress} 490 568 491 \begin{lstlisting}[label=lst:declaration] 569 enum Color( char * ) { Red="R", Green="G", Blue="B" }; 570 enum Animal( int ) { Cat=10, Dog=20 }; 571 with ( Color, Animal ) { 572 char * red_string = Red; // value( Color.Red ) 573 int cat = Cat; // value( Animal.Cat ) 574 } 575 \end{lstlisting} 576 The \lstinline{with} might introduce ambiguity to a scope. Consider the example: 492 enum Sample s1; 493 Sample s2; 494 \end{lstlisting} 495 A declaration of \CFA enumeration instance that has no difference than a C enumeration or other \CFA aggregation. 496 The compiler recognizes the type of a variable declaration by searching the name in all possible types. 497 The @enum@ keyword is not necessary but helps to disambiguate types (questionable). 498 The generated code for a \CFA enumeration declaration is utterly an integer, which is meant to store the position. 577 499 \begin{lstlisting}[label=lst:declaration] 578 enum Color( char * ) { Red="R", Green="G", Blue="B" };579 enum RGB( int ) { Red=0, Green=1, Blue=2 };580 with ( Color, RGB ) {581 // int red = Red;582 }583 \end{lstlisting}584 \CFA will not try to resolve the expression with ambiguity. It would report an error. In this case, it is necessary to qualify @Red@ even inside of the \lstinline{with} clause.585 586 \subsection{Instance Declaration}587 588 589 \begin{lstlisting}[label=lst:var_declaration]590 enum Sample s1;591 \end{lstlisting}592 593 The declaration \CFA-enumeration variable has the same syntax as the C-enumeration. Internally, such a variable will be represented as an EnumInstType.594 \begin{lstlisting}[label=lst:declaration_code]595 500 int s1; 596 \end{lstlisting} 597 The generated code for an enumeration instance is simply an int. It is to hold the position of an enumeration. And usage of variable @s1@ will be converted to return one of its attributes: label, value, or position, with respect to the @Unification@ rule 501 int s2; 502 \end{lstlisting} 503 504 \subsection{Compiler Representation} 505 506 \emph{Work in Progress} 507 508 The internal representation of an enumeration constant is @EnumInstType@. 509 The minimum information an @EnumInstType@ stores is a reference to the \CFA-enumeration declaration and the position of the enumeration constant. 510 \begin{lstlisting}[label=lst:EnumInstType] 511 class EnumInstType { 512 EnumDecl enumDecl; 513 int position; 514 }; 515 \end{lstlisting} 598 516 599 517 \subsection{Unification and Resolution } 600 518 519 \emph{Work in Progress} 601 520 602 521 \begin{lstlisting} … … 685 604 @unification( EnumInstType<Colour>, int )@: @position( EnumInstType< Colour > )@ 686 605 \item 687 return the enumeration constant at position 1606 return the enumeration constant at the position 1 688 607 \end{enumerate} 689 608 \begin{lstlisting} … … 703 622 \end{enumerate} 704 623 The downside of the precedence rule: @EnumInstType@ $\Rightarrow$ @int ( value )@ $\Rightarrow$ @EnumInstType@ may return a different @EnumInstType@ because the value can be repeated and there is no way to know which one is expected $\Rightarrow$ want uniqueness 705 706 \subsection{Casting}707 Casting an EnumInstType to some other type T works similarly to unify the EnumInstType with T. For example:708 \begin{lstlisting}709 enum( int ) Foo { A = 10, B = 100, C = 1000 };710 (int) Foo.A;711 \end{lstlisting}712 The \CFA-compiler unifies @EnumInstType<int>@ with int, with returns @value( Foo.A )@, which has statically known value 10. In other words, \CFA-compiler is aware of a cast expression, and it forms the context for EnumInstType resolution. The expression with type @EnumInstType<int>@ can be replaced by the compile with a constant expression 10, and optionally discard the cast expression.713 714 \subsection{Value Conversion}715 As discussed in section~\ref{lst:var_declaration}, \CFA only saves @position@ as the necessary information. It is necessary for \CFA to generate intermediate code to retrieve other attributes.716 717 \begin{lstlisting}718 Foo a; // int a;719 int j = a;720 char * s = a;721 \end{lstlisting}722 Assume stores a value x, which cannot be statically determined. When assigning a to j in line 2, the compiler @Unify@ j with a, and returns @value( a )@. The generated code for the second line will be723 \begin{lstlisting}724 int j = value( Foo, a )725 \end{lstlisting}726 Similarly, the generated code for the third line is727 \begin{lstlisting}728 char * j = label( Foo, a )729 \end{lstlisting}730 624 731 625 \end{document} -
src/AST/Decl.cpp
r7f2bfb7 r4f1b2d69 41 41 42 42 FunctionDecl::FunctionDecl( const CodeLocation & loc, const std::string & name, 43 std::vector<ptr<TypeDecl>>&& forall, 43 44 std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns, 44 45 CompoundStmt * stmts, Storage::Classes storage, Linkage::Spec linkage, 45 46 std::vector<ptr<Attribute>>&& attrs, Function::Specs fs, ArgumentFlag isVarArgs ) 46 : FunctionDecl( loc, name, {}, {}, std::move(params), std::move(returns), 47 stmts, storage, linkage, std::move(attrs), fs, isVarArgs ) { 47 : DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ), 48 type_params(std::move(forall)), assertions(), 49 params(std::move(params)), returns(std::move(returns)), stmts( stmts ) { 50 FunctionType * ftype = new FunctionType( isVarArgs ); 51 for (auto & param : this->params) { 52 ftype->params.emplace_back(param->get_type()); 53 } 54 for (auto & ret : this->returns) { 55 ftype->returns.emplace_back(ret->get_type()); 56 } 57 for (auto & tp : this->type_params) { 58 ftype->forall.emplace_back(new TypeInstType(tp)); 59 for (auto & ap: tp->assertions) { 60 ftype->assertions.emplace_back(new VariableExpr(loc, ap)); 61 } 62 } 63 this->type = ftype; 48 64 } 49 65 -
src/AST/Decl.hpp
r7f2bfb7 r4f1b2d69 135 135 std::vector< ptr<Expr> > withExprs; 136 136 137 /// Monomorphic Function Constructor: 138 FunctionDecl( const CodeLocation & locaction, const std::string & name, 137 // The difference between the two constructors is in how they handle 138 // assertions. The first constructor uses the assertions from the type 139 // parameters, in the style of the old ast, and puts them on the type. 140 // The second takes an explicite list of assertions and builds a list of 141 // references to them on the type. 142 143 FunctionDecl( const CodeLocation & loc, const std::string & name, std::vector<ptr<TypeDecl>>&& forall, 139 144 std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns, 140 145 CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::Cforall, 141 146 std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}, ArgumentFlag isVarArgs = FixedArgs ); 142 147 143 /// Polymorphic Function Constructor:144 148 FunctionDecl( const CodeLocation & location, const std::string & name, 145 149 std::vector<ptr<TypeDecl>>&& forall, std::vector<ptr<DeclWithType>>&& assertions, -
src/Concurrency/Actors.cpp
r7f2bfb7 r4f1b2d69 265 265 decl->location, 266 266 "__CFA_receive_wrap", 267 {}, // forall 267 268 { 268 269 new ObjectDecl( … … 287 288 ) 288 289 }, // params 289 { 290 { 290 291 new ObjectDecl( 291 292 decl->location, … … 399 400 ) 400 401 )); 401 402 402 403 // Generates: return receiver; 403 404 sendBody->push_back( new ReturnStmt( decl->location, new NameExpr( decl->location, "receiver" ) ) ); … … 407 408 decl->location, 408 409 "?|?", 410 {}, // forall 409 411 { 410 412 new ObjectDecl( … … 419 421 ) 420 422 }, // params 421 { 423 { 422 424 new ObjectDecl( 423 425 decl->location, … … 432 434 { Function::Inline } 433 435 ); 434 436 435 437 // forward decls to resolve use before decl problem for '|' routines 436 438 forwardDecls.insertDecl( *actorIter, *messageIter , ast::deepCopy( sendOperatorFunction ) ); -
src/Concurrency/Corun.cpp
r7f2bfb7 r4f1b2d69 113 113 new FunctionDecl( loc, 114 114 fnName, // name 115 {}, // forall 115 116 { 116 117 new ObjectDecl( loc, … … 260 261 new FunctionDecl( loc, 261 262 fnName, // name 263 {}, // forall 262 264 {}, // params 263 265 {}, // return -
src/Concurrency/KeywordsNew.cpp
r7f2bfb7 r4f1b2d69 482 482 location, 483 483 getter_name, 484 {}, // forall 484 485 { this_decl }, // params 485 486 { ret_decl }, // returns … … 498 499 location, 499 500 "main", 501 {}, 500 502 { ast::deepCopy( this_decl ) }, 501 503 {}, … … 573 575 location, 574 576 "lock", 577 { /* forall */ }, 575 578 { 576 579 // Copy the declaration of this. … … 604 607 location, 605 608 "unlock", 609 { /* forall */ }, 606 610 { 607 611 // Last use, consume the declaration of this. -
src/Concurrency/Waituntil.cpp
r7f2bfb7 r4f1b2d69 553 553 return new FunctionDecl( loc, 554 554 predName, 555 {}, // forall 555 556 { 556 557 new ObjectDecl( loc, … … 559 560 ) 560 561 }, 561 { 562 { 562 563 new ObjectDecl( loc, 563 564 "sat_ret", -
src/ControlStruct/ExceptTranslateNew.cpp
r7f2bfb7 r4f1b2d69 253 253 location, 254 254 "try", 255 {}, //forall 255 256 {}, //no param 256 257 {}, //no return … … 266 267 location, 267 268 "catch", 269 {}, //forall 268 270 { make_index_object( location ), make_exception_object( location ) }, 269 271 {}, //return void … … 279 281 location, 280 282 "match", 283 {}, //forall 281 284 { make_exception_object( location ) }, 282 285 { make_unused_index_object( location ) }, … … 292 295 location, 293 296 "handle", 297 {}, //forall 294 298 { make_exception_object( location ) }, 295 299 { make_bool_object( location ) }, … … 305 309 location, 306 310 "finally", 311 {}, //forall 307 312 { make_voidptr_object( location ) }, 308 313 {}, //return void -
src/InitTweak/FixGlobalInit.cc
r7f2bfb7 r4f1b2d69 84 84 if (inLibrary) ctorParams.emplace_back(ast::ConstantExpr::from_int(location, 200)); 85 85 auto initFunction = new ast::FunctionDecl(location, 86 "__global_init__", {}, {}, {}, {},86 "__global_init__", {}, {}, {}, 87 87 new ast::CompoundStmt(location, std::move(fixer.core.initStmts)), 88 88 ast::Storage::Static, ast::Linkage::C, … … 96 96 if (inLibrary) dtorParams.emplace_back(ast::ConstantExpr::from_int(location, 200)); 97 97 auto destroyFunction = new ast::FunctionDecl( location, 98 "__global_destroy__", {}, {}, {}, {},98 "__global_destroy__", {}, {}, {}, 99 99 new ast::CompoundStmt(location, std::move(fixer.core.destroyStmts)), 100 100 ast::Storage::Static, ast::Linkage::C, -
src/InitTweak/FixInitNew.cpp
r7f2bfb7 r4f1b2d69 74 74 fname, 75 75 std::move(typeParams), 76 {},77 76 {dstParam}, 78 77 {}, … … 900 899 901 900 // void __objName_dtor_atexitN(...) {...} 902 ast::FunctionDecl * dtorCaller = new ast::FunctionDecl(loc, objDecl->mangleName + dtorCallerNamer.newName(), {}, {}, {}, {},new ast::CompoundStmt(loc, {dtor}), ast::Storage::Static, ast::Linkage::C );901 ast::FunctionDecl * dtorCaller = new ast::FunctionDecl(loc, objDecl->mangleName + dtorCallerNamer.newName(), {}, {}, {}, new ast::CompoundStmt(loc, {dtor}), ast::Storage::Static, ast::Linkage::C ); 903 902 dtorCaller->fixUniqueId(); 904 903 // dtorCaller->stmts->push_back( dtor ); -
src/InitTweak/InitTweak.cc
r7f2bfb7 r4f1b2d69 342 342 if (!assign) { 343 343 auto td = new ast::TypeDecl(CodeLocation(), "T", {}, nullptr, ast::TypeDecl::Dtype, true); 344 assign = new ast::FunctionDecl(CodeLocation(), "?=?", {td}, {},344 assign = new ast::FunctionDecl(CodeLocation(), "?=?", {td}, 345 345 { new ast::ObjectDecl(CodeLocation(), "_dst", new ast::ReferenceType(new ast::TypeInstType("T", td))), 346 346 new ast::ObjectDecl(CodeLocation(), "_src", new ast::TypeInstType("T", td))}, -
src/Makefile.am
r7f2bfb7 r4f1b2d69 72 72 73 73 cfa_cpplib_PROGRAMS += $(DEMANGLER) 74 EXTRA_PROGRAMS = ../driver/demangler75 ___driver_demangler_SOURCES = SymTab/demangler.cc # test driver for the demangler, also useful as a sanity check that libdemangle.a is complete76 ___driver_demangler_LDADD = libdemangle.a -ldl # yywrap74 EXTRA_PROGRAMS = demangler 75 demangler_SOURCES = SymTab/demangler.cc # test driver for the demangler, also useful as a sanity check that libdemangle.a is complete 76 demangler_LDADD = libdemangle.a -ldl # yywrap 77 77 noinst_LIBRARIES = $(LIBDEMANGLE) 78 78 EXTRA_LIBRARIES = libdemangle.a -
src/ResolvExpr/CurrentObject.cc
r7f2bfb7 r4f1b2d69 498 498 PRINT( std::cerr << "____untyped: " << expr << std::endl; ) 499 499 auto dit = desigAlts.begin(); 500 auto nexpr = dynamic_cast< const NameExpr * >( expr );501 500 502 501 for ( const Type * t : curTypes ) { 503 502 assert( dit != desigAlts.end() ); 504 503 DesignatorChain & d = *dit; 505 // Name Designation: 506 if ( nexpr ) { 504 if ( auto nexpr = dynamic_cast< const NameExpr *>( expr ) ) { 507 505 PRINT( std::cerr << "____actual: " << t << std::endl; ) 508 506 if ( auto refType = dynamic_cast< const BaseInstType * >( t ) ) { … … 517 515 } 518 516 } 517 } else if ( auto at = dynamic_cast< const ArrayType * >( t ) ) { 518 auto nexpr = dynamic_cast< const NameExpr *>( expr ); 519 for ( const Decl * mem : refType->lookup( nexpr->name ) ) { 520 if ( auto field = dynamic_cast< const ObjectDecl * >( mem ) ) { 521 DesignatorChain d2 = d; 522 d2.emplace_back( new VariableExpr{ expr->location, field } ); 523 newDesigAlts.emplace_back( std::move( d2 ) ); 524 newTypes.emplace_back( at->base ); 525 } 526 } 519 527 } 520 528 521 529 ++dit; 522 // Index Designation:523 530 } else { 524 531 if ( auto at = dynamic_cast< const ArrayType * >( t ) ) { -
src/Virtual/Tables.cc
r7f2bfb7 r4f1b2d69 165 165 location, 166 166 functionName, 167 { /* forall */ }, 167 168 { new ast::ObjectDecl( 168 169 location, -
src/Virtual/VirtualDtor.cpp
r7f2bfb7 r4f1b2d69 248 248 decl->location, 249 249 "__CFA_set_dtor", 250 {}, // forall 250 251 { 251 252 new ObjectDecl( … … 319 320 decl->location, 320 321 "delete", 322 {}, // forall 321 323 { 322 324 new ObjectDecl(
Note:
See TracChangeset
for help on using the changeset viewer.