Changes in / [043a5b6:a935892]
- Files:
-
- 4 added
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
driver/cc1.cc
r043a5b6 ra935892 486 486 int main( const int argc, const char * const argv[], __attribute__((unused)) const char * const env[] ) { 487 487 #ifdef __DEBUG_H__ 488 for ( int i nt i= 0; env[i] != NULL; i += 1 ) {488 for ( int i = 0; env[i] != NULL; i += 1 ) { 489 489 cerr << env[i] << endl; 490 490 } // for -
src/AST/Convert.cpp
r043a5b6 ra935892 10 10 // Created On : Thu May 09 15::37::05 2019 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed May 29 1 1:05:00 201913 // Update Count : 812 // Last Modified On : Wed May 29 17:05:00 2019 13 // Update Count : 9 14 14 // 15 15 … … 77 77 std::list< T * > acceptL( const U & container ) { 78 78 std::list< T * > ret; 79 for ( auto ptr : container ) {79 for ( auto ptr : container ) { 80 80 ret.emplace_back( accept1( ptr ) ); 81 81 } … … 168 168 LinkageSpec::Spec( node->linkage.val ), 169 169 get<FunctionType>().accept1( node->type ), 170 get<CompoundStmt>().accept1( node->stmts ),170 {}, 171 171 get<Attribute>().acceptL( node->attributes ), 172 172 Type::FuncSpecifiers( node->funcSpec.val ) 173 173 ); 174 cache.emplace( node, decl ); 175 decl->statements = get<CompoundStmt>().accept1( node->stmts ); 174 176 decl->withExprs = get<Expression>().acceptL( node->withExprs ); 175 177 if ( dereferenceOperator == node ) { … … 1446 1448 old->name, 1447 1449 GET_ACCEPT_1(type, FunctionType), 1448 GET_ACCEPT_1(statements, CompoundStmt),1450 {}, 1449 1451 { old->storageClasses.val }, 1450 1452 { old->linkage.val }, … … 1453 1455 }; 1454 1456 cache.emplace( old, decl ); 1457 decl->withExprs = GET_ACCEPT_V(withExprs, Expr); 1458 decl->stmts = GET_ACCEPT_1(statements, CompoundStmt); 1455 1459 decl->scopeLevel = old->scopeLevel; 1456 1460 decl->mangleName = old->mangleName; -
src/AST/Decl.cpp
r043a5b6 ra935892 17 17 18 18 #include <cassert> // for assert, strict_dynamic_cast 19 #include <iostream> 19 20 #include <string> 20 21 #include <unordered_map> … … 70 71 } 71 72 73 std::ostream & operator<< ( std::ostream & out, const TypeDecl::Data & data ) { 74 return out << data.kind << ", " << data.isComplete; 75 } 76 72 77 // --- EnumDecl 73 78 -
src/AST/Decl.hpp
r043a5b6 ra935892 16 16 #pragma once 17 17 18 #include <iosfwd> 18 19 #include <string> // for string, to_string 19 20 #include <unordered_map> … … 121 122 ptr<FunctionType> type; 122 123 ptr<CompoundStmt> stmts; 123 std:: list< ptr<Expr> > withExprs;124 std::vector< ptr<Expr> > withExprs; 124 125 125 126 FunctionDecl( const CodeLocation & loc, const std::string &name, FunctionType * type, … … 172 173 173 174 Data() : kind( (TypeVar::Kind)-1 ), isComplete( false ) {} 174 Data( TypeDecl* d ) : kind( d->kind ), isComplete( d->sized ) {}175 Data( const TypeDecl * d ) : kind( d->kind ), isComplete( d->sized ) {} 175 176 Data( TypeVar::Kind k, bool c ) : kind( k ), isComplete( c ) {} 176 Data( const Data & d1, const Data& d2 )177 Data( const Data & d1, const Data & d2 ) 177 178 : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {} 178 179 179 bool operator== ( const Data & o ) const {180 bool operator== ( const Data & o ) const { 180 181 return kind == o.kind && isComplete == o.isComplete; 181 182 } 182 bool operator!= ( const Data & o ) const { return !(*this == o); }183 bool operator!= ( const Data & o ) const { return !(*this == o); } 183 184 }; 184 185 … … 200 201 MUTATE_FRIEND 201 202 }; 203 204 std::ostream & operator<< ( std::ostream &, const TypeDecl::Data & ); 202 205 203 206 /// C-style typedef `typedef Foo Bar` -
src/AST/Expr.cpp
r043a5b6 ra935892 64 64 // references have been removed, in which case dereference returns an lvalue of the 65 65 // base type 66 ret->result.set_and_mutate( base )->set_lvalue( true ); 66 ret->result = base; 67 add_lvalue( ret->result ); 67 68 } 68 69 } … … 173 174 assert( var ); 174 175 assert( var->get_type() ); 175 result.set_and_mutate( var->get_type() )->set_lvalue( true ); 176 result = var->get_type(); 177 add_lvalue( result ); 176 178 } 177 179 … … 306 308 : Expr( loc ), init( i ) { 307 309 assert( t && i ); 308 result.set_and_mutate( t )->set_lvalue( true ); 310 result = t; 311 add_lvalue( result ); 309 312 } 310 313 … … 322 325 "index %d in expr %s", type->size(), index, toString( tuple ).c_str() ); 323 326 // like MemberExpr, TupleIndexExpr is always an lvalue 324 result.set_and_mutate( type->types[ index ] )->set_lvalue( true ); 327 result = type->types[ index ]; 328 add_lvalue( result ); 325 329 } 326 330 -
src/AST/Node.hpp
r043a5b6 ra935892 113 113 } 114 114 115 ptr_base( ptr_base && o ) : node(o.node) { 116 if( node ) _inc(node); 117 } 115 ptr_base( ptr_base && o ) : node(o.node) { o.node = nullptr; } 118 116 119 117 template< enum Node::ref_type o_ref_t > … … 139 137 140 138 ptr_base & operator=( ptr_base && o ) { 141 assign(o.node); 139 if ( node == o.node ) return *this; 140 if ( node ) _dec(node); 141 node = o.node; 142 o.node = nullptr; 142 143 return *this; 143 144 } -
src/AST/Pass.hpp
r043a5b6 ra935892 179 179 180 180 template<typename pass_type> 181 friend void accept All( std::list< ptr<Decl> > & decls, Pass<pass_type>& visitor );181 friend void accept_all( std::list< ptr<Decl> > & decls, Pass<pass_type>& visitor ); 182 182 private: 183 183 -
src/AST/Pass.proto.hpp
r043a5b6 ra935892 312 312 INDEXER_FUNC1( addTrait , const TraitDecl * ); 313 313 INDEXER_FUNC2( addWith , const std::vector< ptr<Expr> > &, const Node * ); 314 INDEXER_FUNC2( addWith , const std::list < ptr<Expr> > &, const Node * );315 314 316 315 // A few extra functions have more complicated behaviour, they are hand written -
src/AST/Print.hpp
r043a5b6 ra935892 17 17 18 18 #include <iosfwd> 19 #include <utility> // for forward 19 20 20 21 #include "AST/Node.hpp" … … 28 29 void print( std::ostream & os, const ast::Node * node, Indenter indent = {} ); 29 30 30 inline void print( std::ostream & os, const ast::Node * node, unsigned int indent ) { 31 print( os, node, Indenter{ Indenter::tabsize, indent }); 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 }); 32 35 } 33 36 -
src/AST/Type.cpp
r043a5b6 ra935892 27 27 namespace ast { 28 28 29 const Type * Type::getComponent( unsigned i ) {29 const Type * Type::getComponent( unsigned i ) const { 30 30 assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i ); 31 31 return this; 32 32 } 33 33 34 const Type * Type::stripDeclarator() {34 const Type * Type::stripDeclarator() const { 35 35 const Type * t; 36 36 const Type * a; … … 39 39 } 40 40 41 const Type * Type::stripReferences() {41 const Type * Type::stripReferences() const { 42 42 const Type * t; 43 43 const ReferenceType * r; -
src/AST/Type.hpp
r043a5b6 ra935892 25 25 #include "Decl.hpp" // for AggregateDecl subclasses 26 26 #include "Fwd.hpp" 27 #include "Node.hpp" // for Node, ptr 27 #include "Node.hpp" // for Node, ptr, ptr_base 28 28 #include "TypeVar.hpp" 29 29 #include "Visitor.hpp" … … 58 58 virtual bool isVoid() const { return size() == 0; } 59 59 /// Get the i'th component of this type 60 virtual const Type * getComponent( unsigned i ) ;60 virtual const Type * getComponent( unsigned i ) const; 61 61 62 62 /// type without outer pointers and arrays 63 const Type * stripDeclarator() ;63 const Type * stripDeclarator() const; 64 64 /// type without outer references 65 const Type * stripReferences() ;65 const Type * stripReferences() const; 66 66 /// number of reference occuring consecutively on the outermost layer of this type 67 67 /// (i.e. do not count references nested within other types) … … 75 75 MUTATE_FRIEND 76 76 }; 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 } 77 89 78 90 /// `void` … … 437 449 unsigned size() const override { return types.size(); } 438 450 439 const Type * getComponent( unsigned i ) override {451 const Type * getComponent( unsigned i ) const override { 440 452 assertf( i < size(), "TupleType::getComponent: index %d must be less than size %d", 441 453 i, size() ); -
src/AST/module.mk
r043a5b6 ra935892 28 28 AST/Print.cpp \ 29 29 AST/Stmt.cpp \ 30 AST/SymbolTable.cpp \ 30 31 AST/Type.cpp \ 32 AST/TypeEnvironment.cpp \ 31 33 AST/TypeSubstitution.cpp 32 34 -
src/AST/porting.md
r043a5b6 ra935892 104 104 * `LinkageSpec::isMangled(Spec)` etc. => `Spec.is_mangled` etc. 105 105 * `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` 106 119 * Boolean constructor parameters get replaced with a dedicated flag enum: 107 120 * e.g. `bool isVarLen;` => `enum LengthFlag { FixedLen, VariableLen };` `LengthFlag isVarLen;` … … 261 274 * feature is `type@thing` e.g. `int@MAX` 262 275 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 263 293 [1] https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Type-Attributes.html#Type-Attributes 264 294 -
src/GenPoly/GenPoly.cc
r043a5b6 ra935892 24 24 #include <vector> // for vector 25 25 26 #include "AST/Type.hpp" 26 27 #include "GenPoly/ErasableScopedMap.h" // for ErasableScopedMap<>::const_it... 27 28 #include "ResolvExpr/typeops.h" // for flatten … … 262 263 } else { 263 264 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 ); 264 273 } 265 274 } -
src/GenPoly/GenPoly.h
r043a5b6 ra935892 20 20 21 21 #include "ErasableScopedMap.h" // for ErasableScopedMap 22 #include "AST/Fwd.hpp" 22 23 #include "SymTab/Mangler.h" // for Mangler 23 24 #include "SynTree/Declaration.h" // for TypeDecl::Data, AggregateDecl, Type... … … 72 73 /// Returns a pointer to the base FunctionType if ty is the type of a function (or pointer to one), NULL otherwise 73 74 FunctionType *getFunctionType( Type *ty ); 75 const ast::FunctionType * getFunctionType( const ast::Type * ty ); 74 76 75 77 /// If expr (after dereferencing N >= 0 pointers) is a variable expression, returns the variable expression, NULL otherwise; -
src/InitTweak/InitTweak.cc
r043a5b6 ra935892 756 756 } 757 757 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 758 769 FunctionDecl * isAssignment( Declaration * decl ) { 759 770 return isCopyFunction( decl, "?=?" ); -
src/InitTweak/InitTweak.h
r043a5b6 ra935892 30 30 FunctionDecl * isCopyConstructor( Declaration * decl ); 31 31 FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname ); 32 bool isCopyFunction( const ast::FunctionDecl * decl ); 32 33 33 34 /// returns the base type of the first parameter to a constructor/destructor/assignment function -
src/Makefile.in
r043a5b6 ra935892 170 170 AST/Init.$(OBJEXT) AST/LinkageSpec.$(OBJEXT) \ 171 171 AST/Node.$(OBJEXT) AST/Pass.$(OBJEXT) AST/Print.$(OBJEXT) \ 172 AST/Stmt.$(OBJEXT) AST/Type.$(OBJEXT) \ 172 AST/Stmt.$(OBJEXT) AST/SymbolTable.$(OBJEXT) \ 173 AST/Type.$(OBJEXT) AST/TypeEnvironment.$(OBJEXT) \ 173 174 AST/TypeSubstitution.$(OBJEXT) 174 175 am__objects_2 = CodeGen/CodeGenerator.$(OBJEXT) \ … … 586 587 AST/Print.cpp \ 587 588 AST/Stmt.cpp \ 589 AST/SymbolTable.cpp \ 588 590 AST/Type.cpp \ 591 AST/TypeEnvironment.cpp \ 589 592 AST/TypeSubstitution.cpp 590 593 … … 754 757 AST/Print.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp) 755 758 AST/Stmt.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp) 759 AST/SymbolTable.$(OBJEXT): AST/$(am__dirstamp) \ 760 AST/$(DEPDIR)/$(am__dirstamp) 756 761 AST/Type.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp) 762 AST/TypeEnvironment.$(OBJEXT): AST/$(am__dirstamp) \ 763 AST/$(DEPDIR)/$(am__dirstamp) 757 764 AST/TypeSubstitution.$(OBJEXT): AST/$(am__dirstamp) \ 758 765 AST/$(DEPDIR)/$(am__dirstamp) … … 1190 1197 @AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/Print.Po@am__quote@ 1191 1198 @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@ 1192 1200 @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@ 1193 1202 @AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/TypeSubstitution.Po@am__quote@ 1194 1203 @AMDEP_TRUE@@am__include@ @am__quote@CodeGen/$(DEPDIR)/CodeGenerator.Po@am__quote@ -
src/ResolvExpr/AlternativeFinder.cc
r043a5b6 ra935892 28 28 #include "Alternative.h" // for AltList, Alternative 29 29 #include "AlternativeFinder.h" 30 #include "AST/Expr.hpp" 31 #include "AST/Type.hpp" 30 32 #include "Common/SemanticError.h" // for SemanticError 31 33 #include "Common/utility.h" // for deleteAll, printAll, CodeLocation … … 222 224 cost.incReference(); 223 225 } 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; 224 236 } 225 237 -
src/ResolvExpr/ResolveAssertions.cc
r043a5b6 ra935892 30 30 #include "Common/Indenter.h" // for Indenter 31 31 #include "Common/utility.h" // for sort_mins 32 #include "GenPoly/GenPoly.h" // for getFunctionType 32 33 #include "ResolvExpr/RenameVars.h" // for renameTyVars 33 34 #include "SymTab/Indexer.h" // for Indexer … … 154 155 Cost k = Cost::zero; 155 156 for ( const auto& assn : x.assns ) { 157 // compute conversion cost from satisfying decl to assertion 156 158 k += computeConversionCost( 157 159 assn.match.adjType, assn.decl->get_type(), indexer, x.env ); 158 160 159 161 // mark vars+specialization cost on function-type assertions 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 } 162 FunctionType* func = GenPoly::getFunctionType( assn.match.cdata.id->get_type() ); 167 163 if ( ! func ) continue; 168 164 -
src/ResolvExpr/Resolver.cc
r043a5b6 ra935892 7 7 // Resolver.cc -- 8 8 // 9 // Author : Richard C. Bilson9 // Author : Aaron B. Moss 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Feb 19 18:09:56201913 // Update Count : 24 011 // Last Modified By : Aaron B. Moss 12 // Last Modified On : Wed May 29 11:00:00 2019 13 // Update Count : 241 14 14 // 15 15 … … 21 21 #include "Alternative.h" // for Alternative, AltList 22 22 #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" 23 31 #include "Common/PassVisitor.h" // for PassVisitor 24 32 #include "Common/SemanticError.h" // for SemanticError 25 33 #include "Common/utility.h" // for ValueGuard, group_iterate 26 #include "CurrentObject.h" // for CurrentObject27 34 #include "InitTweak/GenInit.h" 28 35 #include "InitTweak/InitTweak.h" // for isIntrinsicSingleArgCallStmt 29 #include "RenameVars.h" // for RenameVars, global_renamer30 36 #include "ResolvExpr/TypeEnvironment.h" // for TypeEnvironment 31 #include "Resolver.h"32 #include "ResolvMode.h" // for ResolvMode33 37 #include "SymTab/Autogen.h" // for SizeType 34 38 #include "SymTab/Indexer.h" // for Indexer … … 41 45 #include "SynTree/Visitor.h" // for acceptAll, maybeAccept 42 46 #include "Tuples/Tuples.h" 43 #include "typeops.h" // for extractResultType44 #include "Unify.h" // for unify45 47 #include "Validate/FindSpecialDecls.h" // for SizeType 46 48 … … 48 50 49 51 namespace ResolvExpr { 50 struct Resolver final : public WithIndexer, public WithGuards, public WithVisitorRef<Resolver>, public WithShortCircuiting, public WithStmtsToAdd {51 Resolver () {}52 Resolver ( const SymTab::Indexer & other ) {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 ) { 53 55 indexer = other; 54 56 } … … 101 103 102 104 void resolve( std::list< Declaration * > translationUnit ) { 103 PassVisitor<Resolver > resolver;105 PassVisitor<Resolver_old> resolver; 104 106 acceptAll( translationUnit, resolver ); 105 107 } 106 108 107 109 void resolveDecl( Declaration * decl, const SymTab::Indexer & indexer ) { 108 PassVisitor<Resolver > resolver( indexer );110 PassVisitor<Resolver_old> resolver( indexer ); 109 111 maybeAccept( decl, resolver ); 110 112 } … … 402 404 } 403 405 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 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 409 411 // retained, so the type on the first analysis is preserved and used for selecting the RHS. 410 412 GuardValue( currentObject ); … … 418 420 419 421 template< typename PtrType > 420 void Resolver ::handlePtrType( PtrType * type ) {422 void Resolver_old::handlePtrType( PtrType * type ) { 421 423 if ( type->get_dimension() ) { 422 424 findSingleExpression( type->dimension, Validate::SizeType->clone(), indexer ); … … 424 426 } 425 427 426 void Resolver ::previsit( ArrayType * at ) {428 void Resolver_old::previsit( ArrayType * at ) { 427 429 handlePtrType( at ); 428 430 } 429 431 430 void Resolver ::previsit( PointerType * pt ) {432 void Resolver_old::previsit( PointerType * pt ) { 431 433 handlePtrType( pt ); 432 434 } 433 435 434 void Resolver ::previsit( FunctionDecl * functionDecl ) {436 void Resolver_old::previsit( FunctionDecl * functionDecl ) { 435 437 #if 0 436 438 std::cerr << "resolver visiting functiondecl "; … … 442 444 } 443 445 444 void Resolver ::postvisit( FunctionDecl * functionDecl ) {445 // default value expressions have an environment which shouldn't be there and trips up 446 void Resolver_old::postvisit( FunctionDecl * functionDecl ) { 447 // default value expressions have an environment which shouldn't be there and trips up 446 448 // later passes. 447 449 // xxx - it might be necessary to somehow keep the information from this environment, but I … … 457 459 } 458 460 459 void Resolver ::previsit( EnumDecl * ) {461 void Resolver_old::previsit( EnumDecl * ) { 460 462 // in case we decide to allow nested enums 461 463 GuardValue( inEnumDecl ); … … 463 465 } 464 466 465 void Resolver ::previsit( StaticAssertDecl * assertDecl ) {467 void Resolver_old::previsit( StaticAssertDecl * assertDecl ) { 466 468 findIntegralExpression( assertDecl->condition, indexer ); 467 469 } 468 470 469 void Resolver ::previsit( ExprStmt * exprStmt ) {471 void Resolver_old::previsit( ExprStmt * exprStmt ) { 470 472 visit_children = false; 471 473 assertf( exprStmt->expr, "ExprStmt has null Expression in resolver" ); … … 473 475 } 474 476 475 void Resolver ::previsit( AsmExpr * asmExpr ) {477 void Resolver_old::previsit( AsmExpr * asmExpr ) { 476 478 visit_children = false; 477 479 findVoidExpression( asmExpr->operand, indexer ); … … 481 483 } 482 484 483 void Resolver ::previsit( AsmStmt * asmStmt ) {485 void Resolver_old::previsit( AsmStmt * asmStmt ) { 484 486 visit_children = false; 485 487 acceptAll( asmStmt->get_input(), *visitor ); … … 487 489 } 488 490 489 void Resolver ::previsit( IfStmt * ifStmt ) {491 void Resolver_old::previsit( IfStmt * ifStmt ) { 490 492 findIntegralExpression( ifStmt->condition, indexer ); 491 493 } 492 494 493 void Resolver ::previsit( WhileStmt * whileStmt ) {495 void Resolver_old::previsit( WhileStmt * whileStmt ) { 494 496 findIntegralExpression( whileStmt->condition, indexer ); 495 497 } 496 498 497 void Resolver ::previsit( ForStmt * forStmt ) {499 void Resolver_old::previsit( ForStmt * forStmt ) { 498 500 if ( forStmt->condition ) { 499 501 findIntegralExpression( forStmt->condition, indexer ); … … 505 507 } 506 508 507 void Resolver ::previsit( SwitchStmt * switchStmt ) {509 void Resolver_old::previsit( SwitchStmt * switchStmt ) { 508 510 GuardValue( currentObject ); 509 511 findIntegralExpression( switchStmt->condition, indexer ); … … 512 514 } 513 515 514 void Resolver ::previsit( CaseStmt * caseStmt ) {516 void Resolver_old::previsit( CaseStmt * caseStmt ) { 515 517 if ( caseStmt->condition ) { 516 518 std::list< InitAlternative > initAlts = currentObject.getOptions(); … … 531 533 } 532 534 533 void Resolver ::previsit( BranchStmt * branchStmt ) {535 void Resolver_old::previsit( BranchStmt * branchStmt ) { 534 536 visit_children = false; 535 537 // must resolve the argument for a computed goto … … 542 544 } 543 545 544 void Resolver ::previsit( ReturnStmt * returnStmt ) {546 void Resolver_old::previsit( ReturnStmt * returnStmt ) { 545 547 visit_children = false; 546 548 if ( returnStmt->expr ) { … … 549 551 } 550 552 551 void Resolver ::previsit( ThrowStmt * throwStmt ) {553 void Resolver_old::previsit( ThrowStmt * throwStmt ) { 552 554 visit_children = false; 553 555 // TODO: Replace *exception type with &exception type. … … 561 563 } 562 564 563 void Resolver ::previsit( CatchStmt * catchStmt ) {565 void Resolver_old::previsit( CatchStmt * catchStmt ) { 564 566 if ( catchStmt->cond ) { 565 567 findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer ); … … 576 578 } 577 579 578 void Resolver ::previsit( WaitForStmt * stmt ) {580 void Resolver_old::previsit( WaitForStmt * stmt ) { 579 581 visit_children = false; 580 582 … … 782 784 } 783 785 784 void Resolver ::previsit( SingleInit * singleInit ) {786 void Resolver_old::previsit( SingleInit * singleInit ) { 785 787 visit_children = false; 786 788 // resolve initialization using the possibilities as determined by the currentObject cursor … … 834 836 } 835 837 836 void Resolver ::previsit( ListInit * listInit ) {838 void Resolver_old::previsit( ListInit * listInit ) { 837 839 visit_children = false; 838 840 // move cursor into brace-enclosed initializer-list … … 869 871 870 872 // ConstructorInit - fall back on C-style initializer 871 void Resolver ::fallbackInit( ConstructorInit * ctorInit ) {873 void Resolver_old::fallbackInit( ConstructorInit * ctorInit ) { 872 874 // could not find valid constructor, or found an intrinsic constructor 873 875 // fall back on C-style initializer … … 882 884 void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer ) { 883 885 assert( ctorInit ); 884 PassVisitor<Resolver > resolver( indexer );886 PassVisitor<Resolver_old> resolver( indexer ); 885 887 ctorInit->accept( resolver ); 886 888 } … … 888 890 void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer ) { 889 891 assert( stmtExpr ); 890 PassVisitor<Resolver > resolver( indexer );892 PassVisitor<Resolver_old> resolver( indexer ); 891 893 stmtExpr->accept( resolver ); 892 894 stmtExpr->computeResult(); … … 894 896 } 895 897 896 void Resolver ::previsit( ConstructorInit * ctorInit ) {898 void Resolver_old::previsit( ConstructorInit * ctorInit ) { 897 899 visit_children = false; 898 900 // xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit … … 928 930 // } 929 931 } 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 930 1119 } // namespace ResolvExpr 931 1120 -
src/ResolvExpr/Resolver.h
r043a5b6 ra935892 16 16 #pragma once 17 17 18 #include <list> // for list 18 #include <list> // for list 19 #include <AST/Node.hpp> // for ptr 19 20 20 21 class ConstructorInit; … … 23 24 class StmtExpr; 24 25 namespace SymTab { 25 class Indexer; 26 } // namespace SymTab 26 class Indexer; 27 } // namespace SymTab 28 29 namespace ast { 30 class Decl; 31 } // namespace ast 27 32 28 33 namespace ResolvExpr { … … 40 45 /// Resolves with-stmts and with-clauses on functions 41 46 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 ); 42 50 } // namespace ResolvExpr 43 51 -
src/ResolvExpr/Unify.cc
r043a5b6 ra935892 14 14 // 15 15 16 #include <cassert> // for assertf, assert17 #include <iterator> // for back_insert_iterator, back_inserter18 #include <map> // for _Rb_tree_const_iterator, _Rb_tree_i...19 #include <memory> // for unique_ptr20 #include <set> // for set21 #include <string> // for string, operator==, operator!=, bas...22 #include <utility> // for pair, move16 #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 23 23 #include <vector> 24 24 25 25 #include "AST/Node.hpp" 26 26 #include "AST/Type.hpp" 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 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 38 39 #include "Unify.h" 39 #include "typeops.h" // for flatten, occurs, commonType40 #include "typeops.h" // for flatten, occurs, commonType 40 41 41 42 namespace SymTab { … … 106 107 delete newSecond; 107 108 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; 108 117 } 109 118 … … 130 139 delete newSecond; 131 140 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; 132 149 } 133 150 … … 263 280 } 264 281 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 265 291 Unify::Unify( Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer ) 266 292 : result( false ), type2( type2 ), env( env ), needAssertions( needAssertions ), haveAssertions( haveAssertions ), openVars( openVars ), widenMode( widenMode ), indexer( indexer ) { -
src/ResolvExpr/Unify.h
r043a5b6 ra935892 18 18 #include <list> // for list 19 19 20 #include "AST/TypeEnvironment.hpp" // for TypeEnvironment, AssertionSet, OpenVarSet 20 21 #include "Common/utility.h" // for deleteAll 21 22 #include "SynTree/Declaration.h" // for TypeDecl, TypeDecl::Data 22 23 #include "TypeEnvironment.h" // for AssertionSet, OpenVarSet 23 #include "WidenMode.h" // for WidenMode24 #include "WidenMode.h" // for WidenMode 24 25 25 26 class Type; 26 27 class TypeInstType; 27 28 namespace SymTab { 28 class Indexer; 29 } // namespace SymTab 29 class Indexer; 30 } 31 32 namespace ast { 33 class SymbolTable; 34 class Type; 35 } 30 36 31 37 namespace ResolvExpr { … … 62 68 } 63 69 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 64 75 } // namespace ResolvExpr 65 76 -
src/ResolvExpr/typeops.h
r043a5b6 ra935892 18 18 #include <vector> 19 19 20 #include "AST/Fwd.hpp" 20 21 #include "AST/Node.hpp" 22 #include "AST/SymbolTable.hpp" 21 23 #include "AST/Type.hpp" 24 #include "AST/TypeEnvironment.hpp" 22 25 #include "SynTree/SynTree.h" 23 26 #include "SynTree/Type.h" … … 99 102 } 100 103 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 101 112 /// creates the type represented by the list of returnVals in a FunctionType. The caller owns the return value. 102 113 Type * extractResultType( FunctionType * functionType ); … … 115 126 // in Occurs.cc 116 127 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) 117 129 118 130 template<typename Iter> … … 127 139 // in AlternativeFinder.cc 128 140 void referenceToRvalueConversion( Expression *& expr, Cost & cost ); 141 const ast::Expr * referenceToRvalueConversion( const ast::Expr * expr, Cost & cost ); 129 142 130 143 // flatten tuple type into list of types -
src/SymTab/Mangler.cc
r043a5b6 ra935892 390 390 } // namespace SymTab 391 391 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 392 400 // Local Variables: // 393 401 // tab-width: 4 // -
src/SymTab/Mangler.h
r043a5b6 ra935892 21 21 #include <utility> // for pair 22 22 23 #include "AST/Bitfield.hpp" 24 #include "AST/Fwd.hpp" 23 25 #include "SynTree/SynTree.h" // for Types 24 26 #include "SynTree/Visitor.h" // for Visitor, maybeAccept … … 75 77 } // SymTab 76 78 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 77 111 extern "C" { 78 112 char * cforall_demangle(const char *, int);
Note: See TracChangeset
for help on using the changeset viewer.