Changes in / [7f2bfb7:4f1b2d69]


Ignore:
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • .gitignore

    r7f2bfb7 r4f1b2d69  
    3939driver/cfa-cpp
    4040driver/cc1
    41 driver/demangler
    4241
    4342libcfa/prelude/bootloader.c
     
    6059src/Parser/parser.h
    6160src/Parser/parser.hh
     61src/demangler
    6262
    6363tools/prettyprinter/parser.output
  • configure.ac

    r7f2bfb7 r4f1b2d69  
    244244if test "x$enable_demangler" == xyes; then
    245245        LIBDEMANGLE="libdemangle.a"
    246         DEMANGLER="../driver/demangler"
     246        DEMANGLER="demangler"
    247247else
    248248        LIBDEMANGLE=""
     
    273273        libcfa/Makefile:libcfa/Makefile.dist.in
    274274        tests/Makefile
    275 ])
     275        ])
    276276
    277277# Some of our makefile don't need to be distributed
  • doc/proposals/enum.tex

    r7f2bfb7 r4f1b2d69  
    289289\end{lstlisting}
    290290
    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}
     291\subsection{Runtime Enumeration}
     292
     293The 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 ]
     295const char values[$\,$] = { "Hello", "World" };
     296const char labels[$\,$] = { "First", "Second" };
     297Companion(char *) MyEnum = { .values: values, .labels: labels, .length: 2 };
     298\end{lstlisting}
     299A runtime enumeration can be used to call enumeration functions.
     300\begin{lstlisting}[ label=lst:runtime_enum_usage ]
     301sout | charatstic_string( MyEnum, 1 );
     302>>> Label: Second; Value: World
     303\end{lstlisting}
     304However, a runtime enumeration cannot create an enumeration instance, and it does not support enum-qualified syntax.
     305\begin{lstlisting}[ label=lst:runtime_enum_usage ]
     306MyEnum e = MyEnum.First; // Does not work: cannot create an enumeration instance e,
     307                                    // and MyEnum.First is not recognizable
     308\end{lstlisting}
     309During 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}
    315315
    316316A trait is a collection of constraints in \CFA that can be used to describe types.
    317317The \CFA standard library defines traits to categorize types with related enumeration features.
    318318
    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 
    325319\subsection{Auto Initializable}
    326320\label{s:AutoInitializable}
    327321
    328 
     322TODO: make the initialization rule a separate section.
     323
     324If 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$.
    329325\CFA enumerations have the same rule in enumeration constant initialization.
    330326However, only \CFA types that have defined traits for @zero_t@, @one_t@, and an addition operator can be automatically initialized by \CFA.
     
    360356};
    361357\end{lstlisting}
    362 Note that there is no mechanism to prevent an even value for the direct initialization, such as @C = 6@.
     358Note, there is no mechanism to prevent an even value for the direct initialization, such as @C = 6@.
    363359
    364360In \CFA, character, integral, float, and imaginary types are all @AutoInitialiable@.
     
    371367>>> F, o, z
    372368\end{lstlisting}
    373 \section{Enumeration Features}
     369
    374370\subsection{Iteration and Range}
    375371
    376 It is convenient to iterate over a \CFA enumeration value, e.g.:
     372It is convenient to iterate over a \CFA enumeration, e.g.:
    377373\begin{lstlisting}[label=lst:range_functions]
    378 for ( Alphabet alph; Alphabet ) { sout | alph; }
    379 >>> A B C ... D
     374for ( Alphabet alph; Alphabet ) {
     375        printf( "%d ", alph );
     376}
     377>>> A B C ...
    380378\end{lstlisting}
    381379The for-loop uses the enumeration type @Alphabet@ its range, and iterates through all enumerators in the order defined in the enumeration.
    382380@alph@ is the iterating enumeration object, which returns the value of an @Alphabet@ in this context according to the precedence rule.
    383381
    384 \textbullet\ \CFA offers a shorthand for iterating all enumeration constants:
     382\CFA offers a shorthand for iterating all enumeration constants:
    385383\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.}
     384for ( Alphabet alph ) {
     385        printf( "%d ", alph );
     386}
     387>>> A B C ...
     388\end{lstlisting}
     389The following different loop-control syntax is supported:
     390\begin{lstlisting}[label=lst:range_functions]
     391for ( Alphabet.D )
     392for ( alph; Alphabet.g ~ Alphabet.z )
     393for ( Alphabet alph; Alphabet.R ~ Alphabet.X ~ 2 )
     394\end{lstlisting}
     395\PAB{Explain what each loop does.}
     396Notably, the meaning of ``step'' for an iteration has changed for enumeration.
     397Consider the following example:
     398\begin{lstlisting}[label=lst:range_functions]
     399enum(int) Sequence {
     400        A = 10, B = 12, C = 14; 
     401}
     402for ( s; Sequence.A ~ Sequence.C ) {
     403        printf( "%d ", s );
     404}
     405>>> 10 12 14
     406
     407for ( s; Sequence.A ~ Sequence.A ~ 2 ) {
     408        printf( "%d ", s );
     409}
     410>>> 10 14
     411\end{lstlisting}
     412The range iteration of enumeration does not return the @current_value++@ until it reaches the upper bound.
     413The semantics is to return the next enumeration constant.
     414If a stepping is specified, 2 for example, it returns the 2 enumeration constant after the current one, rather than the @current+2@.
    444415
    445416It is also possible to iterate over an enumeration's labels, implicitly or explicitly:
     
    453424\end{lstlisting}
    454425
    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 ambiguity
    488 \end{lstlisting}
    489 
    490426\section{Implementation}
    491427
    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.
    514429
    515430\subsection{Declaration}
     
    564479If the @aggregation_name@ is identified as a \CFA enumeration, the compiler checks if @field@ presents in the declared \CFA enumeration.
    565480
    566 \subsection{\lstinline{with} Clause/Statement}
     481\subsection{\lstinline{with} Statement}
     482
     483\emph{Work in Progress}
     484
    567485Instead 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
    568491\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:
     492enum Sample s1;
     493Sample s2;
     494\end{lstlisting}
     495A declaration of \CFA enumeration instance that has no difference than a C enumeration or other \CFA aggregation.
     496The compiler recognizes the type of a variable declaration by searching the name in all possible types.
     497The @enum@ keyword is not necessary but helps to disambiguate types (questionable).
     498The generated code for a \CFA enumeration declaration is utterly an integer, which is meant to store the position.
    577499\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]
    595500int 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
     501int s2;
     502\end{lstlisting}
     503
     504\subsection{Compiler Representation}
     505
     506\emph{Work in Progress}
     507
     508The internal representation of an enumeration constant is @EnumInstType@.
     509The 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]
     511class EnumInstType {
     512        EnumDecl enumDecl;
     513        int position;
     514};
     515\end{lstlisting}
    598516
    599517\subsection{Unification and Resolution }
    600518
     519\emph{Work in Progress}
    601520
    602521\begin{lstlisting}
     
    685604@unification( EnumInstType<Colour>, int )@: @position( EnumInstType< Colour > )@
    686605\item
    687 return the enumeration constant at position 1
     606return the enumeration constant at the position 1
    688607\end{enumerate}
    689608\begin{lstlisting}
     
    703622\end{enumerate}
    704623The 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 be
    723 \begin{lstlisting}
    724 int j = value( Foo, a )
    725 \end{lstlisting}
    726 Similarly, the generated code for the third line is
    727 \begin{lstlisting}
    728 char * j = label( Foo, a )
    729 \end{lstlisting}
    730624
    731625\end{document}
  • src/AST/Decl.cpp

    r7f2bfb7 r4f1b2d69  
    4141
    4242FunctionDecl::FunctionDecl( const CodeLocation & loc, const std::string & name,
     43        std::vector<ptr<TypeDecl>>&& forall,
    4344        std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns,
    4445        CompoundStmt * stmts, Storage::Classes storage, Linkage::Spec linkage,
    4546        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;
    4864}
    4965
  • src/AST/Decl.hpp

    r7f2bfb7 r4f1b2d69  
    135135        std::vector< ptr<Expr> > withExprs;
    136136
    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,
    139144                std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns,
    140145                CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::Cforall,
    141146                std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}, ArgumentFlag isVarArgs = FixedArgs );
    142147
    143         /// Polymorphic Function Constructor:
    144148        FunctionDecl( const CodeLocation & location, const std::string & name,
    145149                std::vector<ptr<TypeDecl>>&& forall, std::vector<ptr<DeclWithType>>&& assertions,
  • src/Concurrency/Actors.cpp

    r7f2bfb7 r4f1b2d69  
    265265                decl->location,
    266266                "__CFA_receive_wrap",
     267                {},                     // forall
    267268                {
    268269                    new ObjectDecl(
     
    287288                    )
    288289                },                      // params
    289                 {
     290                { 
    290291                    new ObjectDecl(
    291292                        decl->location,
     
    399400                                )
    400401                        ));
    401 
     402           
    402403            // Generates: return receiver;
    403404            sendBody->push_back( new ReturnStmt( decl->location, new NameExpr( decl->location, "receiver" ) ) );
     
    407408                decl->location,
    408409                "?|?",
     410                {},                     // forall
    409411                {
    410412                    new ObjectDecl(
     
    419421                    )
    420422                },                      // params
    421                 {
     423                { 
    422424                    new ObjectDecl(
    423425                        decl->location,
     
    432434                { Function::Inline }
    433435            );
    434 
     436           
    435437            // forward decls to resolve use before decl problem for '|' routines
    436438            forwardDecls.insertDecl( *actorIter, *messageIter , ast::deepCopy( sendOperatorFunction ) );
  • src/Concurrency/Corun.cpp

    r7f2bfb7 r4f1b2d69  
    113113            new FunctionDecl( loc,
    114114                fnName,                                             // name
     115                {},                                                 // forall
    115116                {
    116117                    new ObjectDecl( loc,
     
    260261            new FunctionDecl( loc,
    261262                fnName,                                             // name
     263                {},                                                 // forall
    262264                {},                                                 // params
    263265                {},                                                 // return
  • src/Concurrency/KeywordsNew.cpp

    r7f2bfb7 r4f1b2d69  
    482482                location,
    483483                getter_name,
     484                {}, // forall
    484485                { this_decl }, // params
    485486                { ret_decl }, // returns
     
    498499                        location,
    499500                        "main",
     501                        {},
    500502                        { ast::deepCopy( this_decl ) },
    501503                        {},
     
    573575                location,
    574576                "lock",
     577                { /* forall */ },
    575578                {
    576579                        // Copy the declaration of this.
     
    604607                location,
    605608                "unlock",
     609                { /* forall */ },
    606610                {
    607611                        // Last use, consume the declaration of this.
  • src/Concurrency/Waituntil.cpp

    r7f2bfb7 r4f1b2d69  
    553553    return new FunctionDecl( loc,
    554554        predName,
     555        {},                     // forall
    555556        {
    556557            new ObjectDecl( loc,
     
    559560            )
    560561        },
    561         {
     562        { 
    562563            new ObjectDecl( loc,
    563564                "sat_ret",
  • src/ControlStruct/ExceptTranslateNew.cpp

    r7f2bfb7 r4f1b2d69  
    253253                location,
    254254                "try",
     255                {}, //forall
    255256                {}, //no param
    256257                {}, //no return
     
    266267                location,
    267268                "catch",
     269                {}, //forall
    268270                { make_index_object( location ), make_exception_object( location ) },
    269271                {}, //return void
     
    279281                location,
    280282                "match",
     283                {}, //forall
    281284                { make_exception_object( location ) },
    282285                { make_unused_index_object( location ) },
     
    292295                location,
    293296                "handle",
     297                {}, //forall
    294298                { make_exception_object( location ) },
    295299                { make_bool_object( location ) },
     
    305309                location,
    306310                "finally",
     311                {}, //forall
    307312                { make_voidptr_object( location ) },
    308313                {}, //return void
  • src/InitTweak/FixGlobalInit.cc

    r7f2bfb7 r4f1b2d69  
    8484                if (inLibrary) ctorParams.emplace_back(ast::ConstantExpr::from_int(location, 200));
    8585                auto initFunction = new ast::FunctionDecl(location,
    86                         "__global_init__", {}, {}, {}, {},
     86                        "__global_init__", {}, {}, {},
    8787                        new ast::CompoundStmt(location, std::move(fixer.core.initStmts)),
    8888                        ast::Storage::Static, ast::Linkage::C,
     
    9696                if (inLibrary) dtorParams.emplace_back(ast::ConstantExpr::from_int(location, 200));
    9797                auto destroyFunction = new ast::FunctionDecl( location,
    98                         "__global_destroy__", {}, {}, {}, {},
     98                        "__global_destroy__", {}, {}, {},
    9999                        new ast::CompoundStmt(location, std::move(fixer.core.destroyStmts)),
    100100                        ast::Storage::Static, ast::Linkage::C,
  • src/InitTweak/FixInitNew.cpp

    r7f2bfb7 r4f1b2d69  
    7474                fname,
    7575                std::move(typeParams),
    76                 {},
    7776                {dstParam},
    7877                {},
     
    900899
    901900                                        // 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 );
    903902                                        dtorCaller->fixUniqueId();
    904903                                        // dtorCaller->stmts->push_back( dtor );
  • src/InitTweak/InitTweak.cc

    r7f2bfb7 r4f1b2d69  
    342342        if (!assign) {
    343343                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},
    345345                { new ast::ObjectDecl(CodeLocation(), "_dst", new ast::ReferenceType(new ast::TypeInstType("T", td))),
    346346                  new ast::ObjectDecl(CodeLocation(), "_src", new ast::TypeInstType("T", td))},
  • src/Makefile.am

    r7f2bfb7 r4f1b2d69  
    7272
    7373cfa_cpplib_PROGRAMS += $(DEMANGLER)
    74 EXTRA_PROGRAMS = ../driver/demangler
    75 ___driver_demangler_SOURCES = SymTab/demangler.cc # test driver for the demangler, also useful as a sanity check that libdemangle.a is complete
    76 ___driver_demangler_LDADD = libdemangle.a -ldl                  # yywrap
     74EXTRA_PROGRAMS = demangler
     75demangler_SOURCES = SymTab/demangler.cc # test driver for the demangler, also useful as a sanity check that libdemangle.a is complete
     76demangler_LDADD = libdemangle.a -ldl                    # yywrap
    7777noinst_LIBRARIES = $(LIBDEMANGLE)
    7878EXTRA_LIBRARIES = libdemangle.a
  • src/ResolvExpr/CurrentObject.cc

    r7f2bfb7 r4f1b2d69  
    498498                PRINT( std::cerr << "____untyped: " << expr << std::endl; )
    499499                auto dit = desigAlts.begin();
    500                 auto nexpr = dynamic_cast< const NameExpr * >( expr );
    501500
    502501                for ( const Type * t : curTypes ) {
    503502                        assert( dit != desigAlts.end() );
    504503                        DesignatorChain & d = *dit;
    505                         // Name Designation:
    506                         if ( nexpr ) {
     504                        if ( auto nexpr = dynamic_cast< const NameExpr *>( expr ) ) {
    507505                                PRINT( std::cerr << "____actual: " << t << std::endl; )
    508506                                if ( auto refType = dynamic_cast< const BaseInstType * >( t ) ) {
     
    517515                                                }
    518516                                        }
     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                                        }
    519527                                }
    520528
    521529                                ++dit;
    522                         // Index Designation:
    523530                        } else {
    524531                                if ( auto at = dynamic_cast< const ArrayType * >( t ) ) {
  • src/Virtual/Tables.cc

    r7f2bfb7 r4f1b2d69  
    165165                location,
    166166                functionName,
     167                { /* forall */ },
    167168                { new ast::ObjectDecl(
    168169                        location,
  • src/Virtual/VirtualDtor.cpp

    r7f2bfb7 r4f1b2d69  
    248248            decl->location,
    249249            "__CFA_set_dtor",
     250            {},                     // forall
    250251            {
    251252                new ObjectDecl(
     
    319320            decl->location,
    320321            "delete",
     322            {},                     // forall
    321323            {
    322324                new ObjectDecl(
Note: See TracChangeset for help on using the changeset viewer.