Changes in / [8d70648:d88f8b3b]


Ignore:
Location:
src
Files:
4 deleted
26 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    r8d70648 rd88f8b3b  
    7575                std::list< T * > acceptL( const U & container ) {
    7676                        std::list< T * > ret;
    77                         for ( auto ptr : container ) {
     77                        for (auto ptr : container ) {
    7878                                ret.emplace_back( accept1( ptr ) );
    7979                        }
     
    14451445                };
    14461446                cache.emplace( old, decl );
    1447                 decl->withExprs = GET_ACCEPT_V(withExprs, Expr);
    14481447                decl->stmts = GET_ACCEPT_1(statements, CompoundStmt);
    14491448                decl->scopeLevel = old->scopeLevel;
  • src/AST/Decl.cpp

    r8d70648 rd88f8b3b  
    1717
    1818#include <cassert>             // for assert, strict_dynamic_cast
    19 #include <iostream>
    2019#include <string>
    2120#include <unordered_map>
     
    7170}
    7271
    73 std::ostream & operator<< ( std::ostream & out, const TypeDecl::Data & data ) {
    74         return out << data.kind << ", " << data.isComplete;
    75 }
    76 
    7772// --- EnumDecl
    7873
  • src/AST/Decl.hpp

    r8d70648 rd88f8b3b  
    1616#pragma once
    1717
    18 #include <iosfwd>
    1918#include <string>              // for string, to_string
    2019#include <unordered_map>
     
    122121        ptr<FunctionType> type;
    123122        ptr<CompoundStmt> stmts;
    124         std::vector< ptr<Expr> > withExprs;
     123        std::list< ptr<Expr> > withExprs;
    125124
    126125        FunctionDecl( const CodeLocation & loc, const std::string &name, FunctionType * type,
     
    173172
    174173                Data() : kind( (TypeVar::Kind)-1 ), isComplete( false ) {}
    175                 Data( const TypeDecl * d ) : kind( d->kind ), isComplete( d->sized ) {}
     174                Data( TypeDecl* d ) : kind( d->kind ), isComplete( d->sized ) {}
    176175                Data( TypeVar::Kind k, bool c ) : kind( k ), isComplete( c ) {}
    177                 Data( const Data & d1, const Data & d2 )
     176                Data( const Data& d1, const Data& d2 )
    178177                : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
    179178
    180                 bool operator== ( const Data & o ) const {
     179                bool operator== ( const Data& o ) const {
    181180                        return kind == o.kind && isComplete == o.isComplete;
    182181                }
    183                 bool operator!= ( const Data & o ) const { return !(*this == o); }
     182                bool operator!= ( const Data& o ) const { return !(*this == o); }
    184183        };
    185184
     
    201200        MUTATE_FRIEND
    202201};
    203 
    204 std::ostream & operator<< ( std::ostream &, const TypeDecl::Data & );
    205202
    206203/// C-style typedef `typedef Foo Bar`
  • src/AST/Expr.cpp

    r8d70648 rd88f8b3b  
    6464                        // references have been removed, in which case dereference returns an lvalue of the
    6565                        // base type
    66                         ret->result = base;
    67                         add_lvalue( ret->result );
     66                        ret->result.set_and_mutate( base )->set_lvalue( true );
    6867                }
    6968        }
     
    174173        assert( var );
    175174        assert( var->get_type() );
    176         result = var->get_type();
    177         add_lvalue( result );
     175        result.set_and_mutate( var->get_type() )->set_lvalue( true );
    178176}
    179177
     
    308306: Expr( loc ), init( i ) {
    309307        assert( t && i );
    310         result = t;
    311         add_lvalue( result );
     308        result.set_and_mutate( t )->set_lvalue( true );
    312309}
    313310
     
    325322                "index %d in expr %s", type->size(), index, toString( tuple ).c_str() );
    326323        // like MemberExpr, TupleIndexExpr is always an lvalue
    327         result = type->types[ index ];
    328         add_lvalue( result );
     324        result.set_and_mutate( type->types[ index ] )->set_lvalue( true );
    329325}
    330326
  • src/AST/Node.hpp

    r8d70648 rd88f8b3b  
    113113        }
    114114
    115         ptr_base( ptr_base && o ) : node(o.node) { o.node = nullptr; }
     115        ptr_base( ptr_base && o ) : node(o.node) {
     116                if( node ) _inc(node);
     117        }
    116118
    117119        template< enum Node::ref_type o_ref_t >
     
    137139
    138140        ptr_base & operator=( ptr_base && o ) {
    139                 if ( node == o.node ) return *this;
    140                 if ( node ) _dec(node);
    141                 node = o.node;
    142                 o.node = nullptr;
     141                assign(o.node);
    143142                return *this;
    144143        }
  • src/AST/Pass.hpp

    r8d70648 rd88f8b3b  
    179179
    180180        template<typename pass_type>
    181         friend void accept_all( std::list< ptr<Decl> > & decls, Pass<pass_type>& visitor );
     181        friend void acceptAll( std::list< ptr<Decl> > & decls, Pass<pass_type>& visitor );
    182182private:
    183183
  • src/AST/Pass.proto.hpp

    r8d70648 rd88f8b3b  
    312312                INDEXER_FUNC1( addTrait  , const TraitDecl *     );
    313313                INDEXER_FUNC2( addWith   , const std::vector< ptr<Expr> > &, const Node * );
     314                INDEXER_FUNC2( addWith   , const std::list  < ptr<Expr> > &, const Node * );
    314315
    315316                // A few extra functions have more complicated behaviour, they are hand written
  • src/AST/Print.hpp

    r8d70648 rd88f8b3b  
    1717
    1818#include <iosfwd>
    19 #include <utility> // for forward
    2019
    2120#include "AST/Node.hpp"
     
    2928void print( std::ostream & os, const ast::Node * node, Indenter indent = {} );
    3029
    31 /// Wrap any standard format printer (matching above) with integer Indenter constructor
    32 template<typename T>
    33 inline void print( std::ostream & os, T && x, unsigned int indent ) {
    34     print( os, std::forward<T>(x), Indenter{ Indenter::tabsize, indent });
     30inline void print( std::ostream & os, const ast::Node * node, unsigned int indent ) {
     31    print( os, node, Indenter{ Indenter::tabsize, indent });
    3532}
    3633
  • src/AST/Type.cpp

    r8d70648 rd88f8b3b  
    2727namespace ast {
    2828
    29 const Type * Type::getComponent( unsigned i ) const {
     29const Type * Type::getComponent( unsigned i ) {
    3030        assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i );
    3131        return this;
    3232}
    3333
    34 const Type * Type::stripDeclarator() const {
     34const Type * Type::stripDeclarator() {
    3535        const Type * t;
    3636        const Type * a;
     
    3939}
    4040
    41 const Type * Type::stripReferences() const {
     41const Type * Type::stripReferences() {
    4242        const Type * t;
    4343        const ReferenceType * r;
  • src/AST/Type.hpp

    r8d70648 rd88f8b3b  
    2525#include "Decl.hpp"          // for AggregateDecl subclasses
    2626#include "Fwd.hpp"
    27 #include "Node.hpp"          // for Node, ptr, ptr_base
     27#include "Node.hpp"          // for Node, ptr
    2828#include "TypeVar.hpp"
    2929#include "Visitor.hpp"
     
    5858        virtual bool isVoid() const { return size() == 0; }
    5959        /// Get the i'th component of this type
    60         virtual const Type * getComponent( unsigned i ) const;
     60        virtual const Type * getComponent( unsigned i );
    6161
    6262        /// type without outer pointers and arrays
    63         const Type * stripDeclarator() const;
     63        const Type * stripDeclarator();
    6464        /// type without outer references
    65         const Type * stripReferences() const;
     65        const Type * stripReferences();
    6666        /// number of reference occuring consecutively on the outermost layer of this type
    6767        /// (i.e. do not count references nested within other types)
     
    7575        MUTATE_FRIEND
    7676};
    77 
    78 /// Set the `is_lvalue` qualifier on this type, cloning only if necessary
    79 template< enum Node::ref_type ref_t >
    80 void add_lvalue( ptr_base< Type, ref_t > & p ) {
    81         if ( ! p->qualifiers.is_lvalue ) p.get_and_mutate()->qualifiers.is_lvalue = true;
    82 }
    83 
    84 /// Clear the qualifiers on this type, cloning only if necessary
    85 template< enum Node::ref_type ref_t >
    86 void clear_qualifiers( ptr_base< Type, ref_t > & p ) {
    87         if ( p->qualifiers != CV::Qualifiers{} ) p.get_and_mutate()->qualifiers = CV::Qualifiers{};
    88 }
    8977
    9078/// `void`
     
    449437        unsigned size() const override { return types.size(); }
    450438
    451         const Type * getComponent( unsigned i ) const override {
     439        const Type * getComponent( unsigned i ) override {
    452440                assertf( i < size(), "TupleType::getComponent: index %d must be less than size %d",
    453441                        i, size() );
  • src/AST/module.mk

    r8d70648 rd88f8b3b  
    2828        AST/Print.cpp \
    2929        AST/Stmt.cpp \
    30         AST/SymbolTable.cpp \
    3130        AST/Type.cpp \
    32         AST/TypeEnvironment.cpp \
    3331        AST/TypeSubstitution.cpp
    3432
  • src/AST/porting.md

    r8d70648 rd88f8b3b  
    104104          * `LinkageSpec::isMangled(Spec)` etc. => `Spec.is_mangled` etc.
    105105          * `LinkageSpec::Intrinsic` etc. => `ast::Linkage::Intrinsic` etc.
    106   * Boolean flags to `SymTab::Mangler::mangle` are now a `SymTab::Mangle::Mode` struct
    107     * uses `bitfield`
    108   * Because `Indexer` isn't a terribly evocative name:
    109     * `SymTab::Indexer` => `ast::SymbolTable`
    110     * `SymTab/Indexer.{h,cc}` => `AST/SymbolTable.{hpp,cpp}`
    111     * **TODO** `WithIndexer` => `WithSymbolTable`
    112       * `indexer` => `symTab`
    113     * `IdData::deleteStmt` => `IdData::deleter`
    114     * `lookupId()` now returns a vector rather than an out-param list
    115     * To avoid name collisions:
    116       * `SymTab::Mangler` => `Mangle`
    117   * `ResolvExpr::TypeEnvironment` => `ast::TypeEnvironment`
    118     * in `AST/TypeEnvironment.hpp`
    119106* Boolean constructor parameters get replaced with a dedicated flag enum:
    120107  * e.g. `bool isVarLen;` => `enum LengthFlag { FixedLen, VariableLen };` `LengthFlag isVarLen;`
     
    274261  * feature is `type@thing` e.g. `int@MAX`
    275262
    276 `referenceToRvalueConversion`
    277 * now returns `const Expr *` rather than mutating argument
    278 
    279 `printAssertionSet`, `printOpenVarSet`
    280 * `ostream &` now first argument, for consistency
    281 
    282 `EqvClass`
    283 * `type` => `bound`
    284 
    285 `TypeEnvironment`
    286 * `makeSubstitution()` => `writeToSubstitution()`
    287 * `isEmpty()` => `empty()`
    288 * removed `clone()` in favour of explicit copies
    289 
    290 `occurs`
    291 * moved to be helper function in `TypeEnvironment.cpp` (its only use)
    292 
    293263[1] https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Type-Attributes.html#Type-Attributes
    294264
  • src/GenPoly/GenPoly.cc

    r8d70648 rd88f8b3b  
    2424#include <vector>                       // for vector
    2525
    26 #include "AST/Type.hpp"
    2726#include "GenPoly/ErasableScopedMap.h"  // for ErasableScopedMap<>::const_it...
    2827#include "ResolvExpr/typeops.h"         // for flatten
     
    263262                } else {
    264263                        return dynamic_cast< FunctionType* >( ty ); // pointer if FunctionType, NULL otherwise
    265                 }
    266         }
    267 
    268         const ast::FunctionType * getFunctionType( const ast::Type * ty ) {
    269                 if ( auto pty = dynamic_cast< const ast::PointerType * >( ty ) ) {
    270                         return pty->base.as< ast::FunctionType >();
    271                 } else {
    272                         return dynamic_cast< const ast::FunctionType * >( ty );
    273264                }
    274265        }
  • src/GenPoly/GenPoly.h

    r8d70648 rd88f8b3b  
    2020
    2121#include "ErasableScopedMap.h"    // for ErasableScopedMap
    22 #include "AST/Fwd.hpp"
    2322#include "SymTab/Mangler.h"       // for Mangler
    2423#include "SynTree/Declaration.h"  // for TypeDecl::Data, AggregateDecl, Type...
     
    7372        /// Returns a pointer to the base FunctionType if ty is the type of a function (or pointer to one), NULL otherwise
    7473        FunctionType *getFunctionType( Type *ty );
    75         const ast::FunctionType * getFunctionType( const ast::Type * ty );
    7674
    7775        /// If expr (after dereferencing N >= 0 pointers) is a variable expression, returns the variable expression, NULL otherwise;
  • src/InitTweak/InitTweak.cc

    r8d70648 rd88f8b3b  
    756756        }
    757757
    758         bool isCopyFunction( const ast::FunctionDecl * decl ) {
    759                 const ast::FunctionType * ftype = decl->type;
    760                 if ( ftype->params.size() != 2 ) return false;
    761 
    762                 const ast::Type * t1 = getPointerBase( ftype->params.front()->get_type() );
    763                 if ( ! t1 ) return false;
    764                 const ast::Type * t2 = ftype->params.back()->get_type();
    765                
    766                 return ResolvExpr::typesCompatibleIgnoreQualifiers( t1, t2, ast::SymbolTable{} );
    767         }
    768 
    769758        FunctionDecl * isAssignment( Declaration * decl ) {
    770759                return isCopyFunction( decl, "?=?" );
  • src/InitTweak/InitTweak.h

    r8d70648 rd88f8b3b  
    3030        FunctionDecl * isCopyConstructor( Declaration * decl );
    3131        FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname );
    32         bool isCopyFunction( const ast::FunctionDecl * decl );
    3332
    3433        /// returns the base type of the first parameter to a constructor/destructor/assignment function
  • src/Makefile.in

    r8d70648 rd88f8b3b  
    170170        AST/Init.$(OBJEXT) AST/LinkageSpec.$(OBJEXT) \
    171171        AST/Node.$(OBJEXT) AST/Pass.$(OBJEXT) AST/Print.$(OBJEXT) \
    172         AST/Stmt.$(OBJEXT) AST/SymbolTable.$(OBJEXT) \
    173         AST/Type.$(OBJEXT) AST/TypeEnvironment.$(OBJEXT) \
     172        AST/Stmt.$(OBJEXT) AST/Type.$(OBJEXT) \
    174173        AST/TypeSubstitution.$(OBJEXT)
    175174am__objects_2 = CodeGen/CodeGenerator.$(OBJEXT) \
     
    587586        AST/Print.cpp \
    588587        AST/Stmt.cpp \
    589         AST/SymbolTable.cpp \
    590588        AST/Type.cpp \
    591         AST/TypeEnvironment.cpp \
    592589        AST/TypeSubstitution.cpp
    593590
     
    757754AST/Print.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp)
    758755AST/Stmt.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp)
    759 AST/SymbolTable.$(OBJEXT): AST/$(am__dirstamp) \
    760         AST/$(DEPDIR)/$(am__dirstamp)
    761756AST/Type.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp)
    762 AST/TypeEnvironment.$(OBJEXT): AST/$(am__dirstamp) \
    763         AST/$(DEPDIR)/$(am__dirstamp)
    764757AST/TypeSubstitution.$(OBJEXT): AST/$(am__dirstamp) \
    765758        AST/$(DEPDIR)/$(am__dirstamp)
     
    11971190@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/Print.Po@am__quote@
    11981191@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/Stmt.Po@am__quote@
    1199 @AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/SymbolTable.Po@am__quote@
    12001192@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/Type.Po@am__quote@
    1201 @AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/TypeEnvironment.Po@am__quote@
    12021193@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/TypeSubstitution.Po@am__quote@
    12031194@AMDEP_TRUE@@am__include@ @am__quote@CodeGen/$(DEPDIR)/CodeGenerator.Po@am__quote@
  • src/ResolvExpr/AlternativeFinder.cc

    r8d70648 rd88f8b3b  
    2828#include "Alternative.h"           // for AltList, Alternative
    2929#include "AlternativeFinder.h"
    30 #include "AST/Expr.hpp"
    31 #include "AST/Type.hpp"
    3230#include "Common/SemanticError.h"  // for SemanticError
    3331#include "Common/utility.h"        // for deleteAll, printAll, CodeLocation
     
    224222                        cost.incReference();
    225223                }
    226         }
    227 
    228         const ast::Expr * referenceToRvalueConversion( const ast::Expr * expr, Cost & cost ) {
    229                 if ( expr->result.as< ast::ReferenceType >() ) {
    230                         // cast away reference from expr
    231                         cost.incReference();
    232                         return new ast::CastExpr{ expr->location, expr, expr->result->stripReferences() };
    233                 }
    234                
    235                 return expr;
    236224        }
    237225
  • src/ResolvExpr/ResolveAssertions.cc

    r8d70648 rd88f8b3b  
    3030#include "Common/Indenter.h"        // for Indenter
    3131#include "Common/utility.h"         // for sort_mins
    32 #include "GenPoly/GenPoly.h"        // for getFunctionType
    3332#include "ResolvExpr/RenameVars.h"  // for renameTyVars
    3433#include "SymTab/Indexer.h"         // for Indexer
     
    155154                        Cost k = Cost::zero;
    156155                        for ( const auto& assn : x.assns ) {
    157                                 // compute conversion cost from satisfying decl to assertion
    158156                                k += computeConversionCost(
    159157                                        assn.match.adjType, assn.decl->get_type(), indexer, x.env );
    160158                               
    161159                                // mark vars+specialization cost on function-type assertions
    162                                 FunctionType* func = GenPoly::getFunctionType( assn.match.cdata.id->get_type() );
     160                                Type* assnType = assn.match.cdata.id->get_type();
     161                                FunctionType* func;
     162                                if ( PointerType* ptr = dynamic_cast< PointerType* >( assnType ) ) {
     163                                        func = dynamic_cast< FunctionType* >( ptr->base );
     164                                } else {
     165                                        func = dynamic_cast< FunctionType* >( assnType );
     166                                }
    163167                                if ( ! func ) continue;
    164168                               
  • src/ResolvExpr/Resolver.cc

    r8d70648 rd88f8b3b  
    77// Resolver.cc --
    88//
    9 // Author           : Aaron B. Moss
     9// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:17:01 2015
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Wed May 29 11:00:00 2019
    13 // Update Count     : 241
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Tue Feb 19 18:09:56 2019
     13// Update Count     : 240
    1414//
    1515
     
    2121#include "Alternative.h"                 // for Alternative, AltList
    2222#include "AlternativeFinder.h"           // for AlternativeFinder, resolveIn...
    23 #include "CurrentObject.h"               // for CurrentObject
    24 #include "RenameVars.h"                  // for RenameVars, global_renamer
    25 #include "Resolver.h"
    26 #include "ResolvMode.h"                  // for ResolvMode
    27 #include "typeops.h"                     // for extractResultType
    28 #include "Unify.h"                       // for unify
    29 #include "AST/Pass.hpp"
    30 #include "AST/SymbolTable.hpp"
    3123#include "Common/PassVisitor.h"          // for PassVisitor
    3224#include "Common/SemanticError.h"        // for SemanticError
    3325#include "Common/utility.h"              // for ValueGuard, group_iterate
     26#include "CurrentObject.h"               // for CurrentObject
    3427#include "InitTweak/GenInit.h"
    3528#include "InitTweak/InitTweak.h"         // for isIntrinsicSingleArgCallStmt
     29#include "RenameVars.h"                  // for RenameVars, global_renamer
    3630#include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
     31#include "Resolver.h"
     32#include "ResolvMode.h"                  // for ResolvMode
    3733#include "SymTab/Autogen.h"              // for SizeType
    3834#include "SymTab/Indexer.h"              // for Indexer
     
    4541#include "SynTree/Visitor.h"             // for acceptAll, maybeAccept
    4642#include "Tuples/Tuples.h"
     43#include "typeops.h"                     // for extractResultType
     44#include "Unify.h"                       // for unify
    4745#include "Validate/FindSpecialDecls.h"   // for SizeType
    4846
     
    5048
    5149namespace ResolvExpr {
    52         struct Resolver_old final : public WithIndexer, public WithGuards, public WithVisitorRef<Resolver_old>, public WithShortCircuiting, public WithStmtsToAdd {
    53                 Resolver_old() {}
    54                 Resolver_old( const SymTab::Indexer & other ) {
     50        struct Resolver final : public WithIndexer, public WithGuards, public WithVisitorRef<Resolver>, public WithShortCircuiting, public WithStmtsToAdd {
     51                Resolver() {}
     52                Resolver( const SymTab::Indexer & other ) {
    5553                        indexer = other;
    5654                }
     
    103101
    104102        void resolve( std::list< Declaration * > translationUnit ) {
    105                 PassVisitor<Resolver_old> resolver;
     103                PassVisitor<Resolver> resolver;
    106104                acceptAll( translationUnit, resolver );
    107105        }
    108106
    109107        void resolveDecl( Declaration * decl, const SymTab::Indexer & indexer ) {
    110                 PassVisitor<Resolver_old> resolver( indexer );
     108                PassVisitor<Resolver> resolver( indexer );
    111109                maybeAccept( decl, resolver );
    112110        }
     
    404402        }
    405403
    406         void Resolver_old::previsit( ObjectDecl * objectDecl ) {
    407                 // To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that 
    408                 // class-variable initContext is changed multiple time because the LHS is analysed twice. 
    409                 // The second analysis changes initContext because of a function type can contain object 
    410                 // declarations in the return and parameter types. So each value of initContext is 
     404        void Resolver::previsit( ObjectDecl * objectDecl ) {
     405                // To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that
     406                // class-variable initContext is changed multiple time because the LHS is analysed twice.
     407                // The second analysis changes initContext because of a function type can contain object
     408                // declarations in the return and parameter types. So each value of initContext is
    411409                // retained, so the type on the first analysis is preserved and used for selecting the RHS.
    412410                GuardValue( currentObject );
     
    420418
    421419        template< typename PtrType >
    422         void Resolver_old::handlePtrType( PtrType * type ) {
     420        void Resolver::handlePtrType( PtrType * type ) {
    423421                if ( type->get_dimension() ) {
    424422                        findSingleExpression( type->dimension, Validate::SizeType->clone(), indexer );
     
    426424        }
    427425
    428         void Resolver_old::previsit( ArrayType * at ) {
     426        void Resolver::previsit( ArrayType * at ) {
    429427                handlePtrType( at );
    430428        }
    431429
    432         void Resolver_old::previsit( PointerType * pt ) {
     430        void Resolver::previsit( PointerType * pt ) {
    433431                handlePtrType( pt );
    434432        }
    435433
    436         void Resolver_old::previsit( FunctionDecl * functionDecl ) {
     434        void Resolver::previsit( FunctionDecl * functionDecl ) {
    437435#if 0
    438436                std::cerr << "resolver visiting functiondecl ";
     
    444442        }
    445443
    446         void Resolver_old::postvisit( FunctionDecl * functionDecl ) {
    447                 // default value expressions have an environment which shouldn't be there and trips up 
     444        void Resolver::postvisit( FunctionDecl * functionDecl ) {
     445                // default value expressions have an environment which shouldn't be there and trips up
    448446                // later passes.
    449447                // xxx - it might be necessary to somehow keep the information from this environment, but I
     
    459457        }
    460458
    461         void Resolver_old::previsit( EnumDecl * ) {
     459        void Resolver::previsit( EnumDecl * ) {
    462460                // in case we decide to allow nested enums
    463461                GuardValue( inEnumDecl );
     
    465463        }
    466464
    467         void Resolver_old::previsit( StaticAssertDecl * assertDecl ) {
     465        void Resolver::previsit( StaticAssertDecl * assertDecl ) {
    468466                findIntegralExpression( assertDecl->condition, indexer );
    469467        }
    470468
    471         void Resolver_old::previsit( ExprStmt * exprStmt ) {
     469        void Resolver::previsit( ExprStmt * exprStmt ) {
    472470                visit_children = false;
    473471                assertf( exprStmt->expr, "ExprStmt has null Expression in resolver" );
     
    475473        }
    476474
    477         void Resolver_old::previsit( AsmExpr * asmExpr ) {
     475        void Resolver::previsit( AsmExpr * asmExpr ) {
    478476                visit_children = false;
    479477                findVoidExpression( asmExpr->operand, indexer );
     
    483481        }
    484482
    485         void Resolver_old::previsit( AsmStmt * asmStmt ) {
     483        void Resolver::previsit( AsmStmt * asmStmt ) {
    486484                visit_children = false;
    487485                acceptAll( asmStmt->get_input(), *visitor );
     
    489487        }
    490488
    491         void Resolver_old::previsit( IfStmt * ifStmt ) {
     489        void Resolver::previsit( IfStmt * ifStmt ) {
    492490                findIntegralExpression( ifStmt->condition, indexer );
    493491        }
    494492
    495         void Resolver_old::previsit( WhileStmt * whileStmt ) {
     493        void Resolver::previsit( WhileStmt * whileStmt ) {
    496494                findIntegralExpression( whileStmt->condition, indexer );
    497495        }
    498496
    499         void Resolver_old::previsit( ForStmt * forStmt ) {
     497        void Resolver::previsit( ForStmt * forStmt ) {
    500498                if ( forStmt->condition ) {
    501499                        findIntegralExpression( forStmt->condition, indexer );
     
    507505        }
    508506
    509         void Resolver_old::previsit( SwitchStmt * switchStmt ) {
     507        void Resolver::previsit( SwitchStmt * switchStmt ) {
    510508                GuardValue( currentObject );
    511509                findIntegralExpression( switchStmt->condition, indexer );
     
    514512        }
    515513
    516         void Resolver_old::previsit( CaseStmt * caseStmt ) {
     514        void Resolver::previsit( CaseStmt * caseStmt ) {
    517515                if ( caseStmt->condition ) {
    518516                        std::list< InitAlternative > initAlts = currentObject.getOptions();
     
    533531        }
    534532
    535         void Resolver_old::previsit( BranchStmt * branchStmt ) {
     533        void Resolver::previsit( BranchStmt * branchStmt ) {
    536534                visit_children = false;
    537535                // must resolve the argument for a computed goto
     
    544542        }
    545543
    546         void Resolver_old::previsit( ReturnStmt * returnStmt ) {
     544        void Resolver::previsit( ReturnStmt * returnStmt ) {
    547545                visit_children = false;
    548546                if ( returnStmt->expr ) {
     
    551549        }
    552550
    553         void Resolver_old::previsit( ThrowStmt * throwStmt ) {
     551        void Resolver::previsit( ThrowStmt * throwStmt ) {
    554552                visit_children = false;
    555553                // TODO: Replace *exception type with &exception type.
     
    563561        }
    564562
    565         void Resolver_old::previsit( CatchStmt * catchStmt ) {
     563        void Resolver::previsit( CatchStmt * catchStmt ) {
    566564                if ( catchStmt->cond ) {
    567565                        findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer );
     
    578576        }
    579577
    580         void Resolver_old::previsit( WaitForStmt * stmt ) {
     578        void Resolver::previsit( WaitForStmt * stmt ) {
    581579                visit_children = false;
    582580
     
    784782        }
    785783
    786         void Resolver_old::previsit( SingleInit * singleInit ) {
     784        void Resolver::previsit( SingleInit * singleInit ) {
    787785                visit_children = false;
    788786                // resolve initialization using the possibilities as determined by the currentObject cursor
     
    836834        }
    837835
    838         void Resolver_old::previsit( ListInit * listInit ) {
     836        void Resolver::previsit( ListInit * listInit ) {
    839837                visit_children = false;
    840838                // move cursor into brace-enclosed initializer-list
     
    871869
    872870        // ConstructorInit - fall back on C-style initializer
    873         void Resolver_old::fallbackInit( ConstructorInit * ctorInit ) {
     871        void Resolver::fallbackInit( ConstructorInit * ctorInit ) {
    874872                // could not find valid constructor, or found an intrinsic constructor
    875873                // fall back on C-style initializer
     
    884882        void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer ) {
    885883                assert( ctorInit );
    886                 PassVisitor<Resolver_old> resolver( indexer );
     884                PassVisitor<Resolver> resolver( indexer );
    887885                ctorInit->accept( resolver );
    888886        }
     
    890888        void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer ) {
    891889                assert( stmtExpr );
    892                 PassVisitor<Resolver_old> resolver( indexer );
     890                PassVisitor<Resolver> resolver( indexer );
    893891                stmtExpr->accept( resolver );
    894892                stmtExpr->computeResult();
     
    896894        }
    897895
    898         void Resolver_old::previsit( ConstructorInit * ctorInit ) {
     896        void Resolver::previsit( ConstructorInit * ctorInit ) {
    899897                visit_children = false;
    900898                // xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit
     
    930928                // }
    931929        }
    932 
    933         ///////////////////////////////////////////////////////////////////////////
    934         //
    935         // *** NEW RESOLVER ***
    936         //
    937         ///////////////////////////////////////////////////////////////////////////
    938 
    939         class Resolver_new final
    940         : public ast::WithIndexer, public ast::WithGuards, public ast::WithVisitorRef<Resolver_new>,
    941           public ast::WithShortCircuiting, public ast::WithStmtsToAdd<> {
    942                  
    943         public:
    944                 Resolver_new() = default;
    945                 Resolver_new( const ast::SymbolTable & syms ) { /*symtab = syms;*/ }
    946 
    947                 void previsit( ast::FunctionDecl * functionDecl );
    948                 ast::DeclWithType * postvisit( ast::FunctionDecl * functionDecl );
    949                 void previsit( ast::ObjectDecl * objectDecl );
    950                 void previsit( ast::EnumDecl * enumDecl );
    951                 void previsit( ast::StaticAssertDecl * assertDecl );
    952 
    953                 void previsit( ast::ArrayType * at );
    954                 void previsit( ast::PointerType * pt );
    955 
    956                 void previsit( ast::ExprStmt * exprStmt );
    957                 void previsit( ast::AsmExpr * asmExpr );
    958                 void previsit( ast::AsmStmt * asmStmt );
    959                 void previsit( ast::IfStmt * ifStmt );
    960                 void previsit( ast::WhileStmt * whileStmt );
    961                 void previsit( ast::ForStmt * forStmt );
    962                 void previsit( ast::SwitchStmt * switchStmt );
    963                 void previsit( ast::CaseStmt * caseStmt );
    964                 void previsit( ast::BranchStmt * branchStmt );
    965                 void previsit( ast::ReturnStmt * returnStmt );
    966                 void previsit( ast::ThrowStmt * throwStmt );
    967                 void previsit( ast::CatchStmt * catchStmt );
    968                 void previsit( ast::WaitForStmt * stmt );
    969 
    970                 void previsit( ast::SingleInit * singleInit );
    971                 void previsit( ast::ListInit * listInit );
    972                 void previsit( ast::ConstructorInit * ctorInit );
    973         };
    974 
    975         void resolve( std::list< ast::ptr<ast::Decl> >& translationUnit ) {
    976                 ast::Pass<Resolver_new> resolver;
    977                 accept_all( translationUnit, resolver );
    978         }
    979 
    980         void previsit( ast::FunctionDecl * functionDecl ) {
    981                 #warning unimplemented; Resolver port in progress
    982                 (void)functionDecl;
    983                 assert(false);
    984         }
    985 
    986         ast::DeclWithType * postvisit( ast::FunctionDecl * functionDecl ) {
    987                 #warning unimplemented; Resolver port in progress
    988                 (void)functionDecl;
    989                 assert(false);
    990                 return nullptr;
    991         }
    992 
    993         void previsit( ast::ObjectDecl * objectDecl ) {
    994                 #warning unimplemented; Resolver port in progress
    995                 (void)objectDecl;
    996                 assert(false);
    997         }
    998 
    999         void previsit( ast::EnumDecl * enumDecl ) {
    1000                 #warning unimplemented; Resolver port in progress
    1001                 (void)enumDecl;
    1002                 assert(false);
    1003         }
    1004 
    1005         void previsit( ast::StaticAssertDecl * assertDecl ) {
    1006                 #warning unimplemented; Resolver port in progress
    1007                 (void)assertDecl;
    1008                 assert(false);
    1009         }
    1010 
    1011         void previsit( ast::ArrayType * at ) {
    1012                 #warning unimplemented; Resolver port in progress
    1013                 (void)at;
    1014                 assert(false);
    1015         }
    1016 
    1017         void previsit( ast::PointerType * pt ) {
    1018                 #warning unimplemented; Resolver port in progress
    1019                 (void)pt;
    1020                 assert(false);
    1021         }
    1022 
    1023         void previsit( ast::ExprStmt * exprStmt ) {
    1024                 #warning unimplemented; Resolver port in progress
    1025                 (void)exprStmt;
    1026                 assert(false);
    1027         }
    1028 
    1029         void previsit( ast::AsmExpr * asmExpr ) {
    1030                 #warning unimplemented; Resolver port in progress
    1031                 (void)asmExpr;
    1032                 assert(false);
    1033         }
    1034 
    1035         void previsit( ast::AsmStmt * asmStmt ) {
    1036                 #warning unimplemented; Resolver port in progress
    1037                 (void)asmStmt;
    1038                 assert(false);
    1039         }
    1040 
    1041         void previsit( ast::IfStmt * ifStmt ) {
    1042                 #warning unimplemented; Resolver port in progress
    1043                 (void)ifStmt;
    1044                 assert(false);
    1045         }
    1046 
    1047         void previsit( ast::WhileStmt * whileStmt ) {
    1048                 #warning unimplemented; Resolver port in progress
    1049                 (void)whileStmt;
    1050                 assert(false);
    1051         }
    1052 
    1053         void previsit( ast::ForStmt * forStmt ) {
    1054                 #warning unimplemented; Resolver port in progress
    1055                 (void)forStmt;
    1056                 assert(false);
    1057         }
    1058 
    1059         void previsit( ast::SwitchStmt * switchStmt ) {
    1060                 #warning unimplemented; Resolver port in progress
    1061                 (void)switchStmt;
    1062                 assert(false);
    1063         }
    1064 
    1065         void previsit( ast::CaseStmt * caseStmt ) {
    1066                 #warning unimplemented; Resolver port in progress
    1067                 (void)caseStmt;
    1068                 assert(false);
    1069         }
    1070 
    1071         void previsit( ast::BranchStmt * branchStmt ) {
    1072                 #warning unimplemented; Resolver port in progress
    1073                 (void)branchStmt;
    1074                 assert(false);
    1075         }
    1076 
    1077         void previsit( ast::ReturnStmt * returnStmt ) {
    1078                 #warning unimplemented; Resolver port in progress
    1079                 (void)returnStmt;
    1080                 assert(false);
    1081         }
    1082 
    1083         void previsit( ast::ThrowStmt * throwStmt ) {
    1084                 #warning unimplemented; Resolver port in progress
    1085                 (void)throwStmt;
    1086                 assert(false);
    1087         }
    1088 
    1089         void previsit( ast::CatchStmt * catchStmt ) {
    1090                 #warning unimplemented; Resolver port in progress
    1091                 (void)catchStmt;
    1092                 assert(false);
    1093         }
    1094 
    1095         void previsit( ast::WaitForStmt * stmt ) {
    1096                 #warning unimplemented; Resolver port in progress
    1097                 (void)stmt;
    1098                 assert(false);
    1099         }
    1100 
    1101         void previsit( ast::SingleInit * singleInit ) {
    1102                 #warning unimplemented; Resolver port in progress
    1103                 (void)singleInit;
    1104                 assert(false);
    1105         }
    1106 
    1107         void previsit( ast::ListInit * listInit ) {
    1108                 #warning unimplemented; Resolver port in progress
    1109                 (void)listInit;
    1110                 assert(false);
    1111         }
    1112 
    1113         void previsit( ast::ConstructorInit * ctorInit ) {
    1114                 #warning unimplemented; Resolver port in progress
    1115                 (void)ctorInit;
    1116                 assert(false);
    1117         }
    1118 
    1119930} // namespace ResolvExpr
    1120931
  • src/ResolvExpr/Resolver.h

    r8d70648 rd88f8b3b  
    1616#pragma once
    1717
    18 #include <list>          // for list
    19 #include <AST/Node.hpp>  // for ptr
     18#include <list>  // for list
    2019
    2120class ConstructorInit;
     
    2423class StmtExpr;
    2524namespace SymTab {
    26         class Indexer;
    27 } // namespace SymTab
    28 
    29 namespace ast {
    30         class Decl;
    31 } // namespace ast
     25class Indexer;
     26}  // namespace SymTab
    3227
    3328namespace ResolvExpr {
     
    4540        /// Resolves with-stmts and with-clauses on functions
    4641        void resolveWithExprs( std::list< Declaration * > & translationUnit );
    47 
    48         /// Checks types and binds syntactic constructs to typed representations
    49         void resolve( std::list< ast::ptr<ast::Decl> >& translationUnit );
    5042} // namespace ResolvExpr
    5143
  • src/ResolvExpr/Unify.cc

    r8d70648 rd88f8b3b  
    1414//
    1515
    16 #include <cassert>                  // for assertf, assert
    17 #include <iterator>                 // for back_insert_iterator, back_inserter
    18 #include <map>                      // for _Rb_tree_const_iterator, _Rb_tree_i...
    19 #include <memory>                   // for unique_ptr
    20 #include <set>                      // for set
    21 #include <string>                   // for string, operator==, operator!=, bas...
    22 #include <utility>                  // for pair, move
     16#include <cassert>                // for assertf, assert
     17#include <iterator>               // for back_insert_iterator, back_inserter
     18#include <map>                    // for _Rb_tree_const_iterator, _Rb_tree_i...
     19#include <memory>                 // for unique_ptr
     20#include <set>                    // for set
     21#include <string>                 // for string, operator==, operator!=, bas...
     22#include <utility>                // for pair, move
    2323#include <vector>
    2424
    2525#include "AST/Node.hpp"
    2626#include "AST/Type.hpp"
    27 #include "AST/TypeEnvironment.hpp"
    28 #include "Common/PassVisitor.h"     // for PassVisitor
    29 #include "FindOpenVars.h"           // for findOpenVars
    30 #include "Parser/LinkageSpec.h"     // for C
    31 #include "SynTree/Constant.h"       // for Constant
    32 #include "SynTree/Declaration.h"    // for TypeDecl, TypeDecl::Data, Declarati...
    33 #include "SynTree/Expression.h"     // for TypeExpr, Expression, ConstantExpr
    34 #include "SynTree/Mutator.h"        // for Mutator
    35 #include "SynTree/Type.h"           // for Type, TypeInstType, FunctionType
    36 #include "SynTree/Visitor.h"        // for Visitor
    37 #include "Tuples/Tuples.h"          // for isTtype
    38 #include "TypeEnvironment.h"        // for EqvClass, AssertionSet, OpenVarSet
     27#include "Common/PassVisitor.h"   // for PassVisitor
     28#include "FindOpenVars.h"         // for findOpenVars
     29#include "Parser/LinkageSpec.h"   // for C
     30#include "SynTree/Constant.h"     // for Constant
     31#include "SynTree/Declaration.h"  // for TypeDecl, TypeDecl::Data, Declarati...
     32#include "SynTree/Expression.h"   // for TypeExpr, Expression, ConstantExpr
     33#include "SynTree/Mutator.h"      // for Mutator
     34#include "SynTree/Type.h"         // for Type, TypeInstType, FunctionType
     35#include "SynTree/Visitor.h"      // for Visitor
     36#include "Tuples/Tuples.h"        // for isTtype
     37#include "TypeEnvironment.h"      // for EqvClass, AssertionSet, OpenVarSet
    3938#include "Unify.h"
    40 #include "typeops.h"                // for flatten, occurs, commonType
     39#include "typeops.h"              // for flatten, occurs, commonType
    4140
    4241namespace SymTab {
     
    107106                delete newSecond;
    108107                return result;
    109         }
    110 
    111         bool typesCompatible(
    112                         const ast::Type * first, const ast::Type * second, const ast::SymbolTable & symtab,
    113                         const ast::TypeEnvironment & env ) {
    114                 #warning unimplemented
    115                 assert((first, second, symtab, env, false));
    116                 return false;
    117108        }
    118109
     
    139130                delete newSecond;
    140131                return result;
    141         }
    142 
    143         bool typesCompatibleIgnoreQualifiers(
    144                         const ast::Type * first, const ast::Type * second, const ast::SymbolTable & symtab,
    145                         const ast::TypeEnvironment & env ) {
    146                 #warning unimplemented
    147                 assert((first, second, symtab, env, false));
    148                 return false;
    149132        }
    150133
     
    280263        }
    281264
    282         bool unifyInexact(
    283                         const ast::Type * type1, const ast::Type * type2, ast::TypeEnvironment & env,
    284                         ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & openVars,
    285                         WidenMode widenMode, const ast::SymbolTable & symtab, const ast::Type *& common ) {
    286                 #warning unimplemented
    287                 assert((type1, type2, env, need, have, openVars, widenMode, symtab, common, false));
    288                 return false;
    289         }
    290 
    291265        Unify::Unify( Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer )
    292266                : result( false ), type2( type2 ), env( env ), needAssertions( needAssertions ), haveAssertions( haveAssertions ), openVars( openVars ), widenMode( widenMode ), indexer( indexer ) {
  • src/ResolvExpr/Unify.h

    r8d70648 rd88f8b3b  
    1818#include <list>                   // for list
    1919
    20 #include "AST/TypeEnvironment.hpp"  // for TypeEnvironment, AssertionSet, OpenVarSet
    2120#include "Common/utility.h"       // for deleteAll
    2221#include "SynTree/Declaration.h"  // for TypeDecl, TypeDecl::Data
    2322#include "TypeEnvironment.h"      // for AssertionSet, OpenVarSet
    24 #include "WidenMode.h"              // for WidenMode
     23#include "WidenMode.h"            // for WidenMode
    2524
    2625class Type;
    2726class TypeInstType;
    2827namespace SymTab {
    29         class Indexer;
    30 }
    31 
    32 namespace ast {
    33         class SymbolTable;
    34         class Type;
    35 }
     28class Indexer;
     29}  // namespace SymTab
    3630
    3731namespace ResolvExpr {
     
    6862        }
    6963
    70         bool unifyInexact(
    71                 const ast::Type * type1, const ast::Type * type2, ast::TypeEnvironment & env,
    72                 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & openVars,
    73                 WidenMode widenMode, const ast::SymbolTable & symtab, const ast::Type *& common );
    74 
    7564} // namespace ResolvExpr
    7665
  • src/ResolvExpr/typeops.h

    r8d70648 rd88f8b3b  
    1818#include <vector>
    1919
    20 #include "AST/Fwd.hpp"
    2120#include "AST/Node.hpp"
    22 #include "AST/SymbolTable.hpp"
    2321#include "AST/Type.hpp"
    24 #include "AST/TypeEnvironment.hpp"
    2522#include "SynTree/SynTree.h"
    2623#include "SynTree/Type.h"
     
    10299        }
    103100
    104         bool typesCompatible(
    105                 const ast::Type *, const ast::Type *, const ast::SymbolTable &,
    106                 const ast::TypeEnvironment & env = {} );
    107        
    108         bool typesCompatibleIgnoreQualifiers(
    109                 const ast::Type *, const ast::Type *, const ast::SymbolTable &,
    110                 const ast::TypeEnvironment & env = {} );
    111 
    112101        /// creates the type represented by the list of returnVals in a FunctionType. The caller owns the return value.
    113102        Type * extractResultType( FunctionType * functionType );
     
    126115        // in Occurs.cc
    127116        bool occurs( Type *type, std::string varName, const TypeEnvironment &env );
    128         // new AST version in TypeEnvironment.cpp (only place it was used in old AST)
    129117
    130118        template<typename Iter>
     
    139127        // in AlternativeFinder.cc
    140128        void referenceToRvalueConversion( Expression *& expr, Cost & cost );
    141         const ast::Expr * referenceToRvalueConversion( const ast::Expr * expr, Cost & cost );
    142129
    143130        // flatten tuple type into list of types
  • src/SymTab/Mangler.cc

    r8d70648 rd88f8b3b  
    390390} // namespace SymTab
    391391
    392 namespace Mangle {
    393         std::string mangle( const ast::Node * decl, Mangle::Mode mode ) {
    394                 #warning unimplemented
    395                 assert( decl && mode.val && false );
    396                 return "";
    397         }
    398 } // namespace Mangle
    399 
    400392// Local Variables: //
    401393// tab-width: 4 //
  • src/SymTab/Mangler.h

    r8d70648 rd88f8b3b  
    2121#include <utility>            // for pair
    2222
    23 #include "AST/Bitfield.hpp"
    24 #include "AST/Fwd.hpp"
    2523#include "SynTree/SynTree.h"  // for Types
    2624#include "SynTree/Visitor.h"  // for Visitor, maybeAccept
     
    7775} // SymTab
    7876
    79 namespace Mangle {
    80         /// Bitflags for mangle modes
    81         enum {
    82                 NoOverrideable  = 1 << 0,
    83                 Type            = 1 << 1,
    84                 NoGenericParams = 1 << 2
    85         };
    86 
    87         /// Bitflag type for mangler modes
    88         struct mangle_flags {
    89                 union {
    90                         unsigned int val;
    91                         struct {
    92                                 bool no_overrideable   : 1;
    93                                 bool type              : 1;
    94                                 bool no_generic_params : 1;
    95                         };
    96                 };
    97 
    98                 constexpr mangle_flags( unsigned int val ) : val(val) {}
    99         };
    100 
    101         using Mode = bitfield<mangle_flags>;
    102 
    103         /// Mangle declaration name
    104         std::string mangle( const ast::Node * decl, Mode mode = {} );
    105 
    106         namespace Encoding {
    107                 using namespace SymTab::Mangler::Encoding;
    108         };
    109 }
    110 
    11177extern "C" {
    11278        char * cforall_demangle(const char *, int);
Note: See TracChangeset for help on using the changeset viewer.