- Timestamp:
- Dec 6, 2021, 5:06:14 PM (4 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum, stuck-waitfor-destruct
- Children:
- 75873cf
- Parents:
- 813dfd86 (diff), a83012bf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/AST
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Decl.hpp
r813dfd86 r295dd61 270 270 : AggregateDecl( loc, name, std::move(attrs), linkage ), kind( kind ) {} 271 271 272 bool is_coroutine() { return kind == Coroutine; }273 bool is_generator() { return kind == Generator; }274 bool is_monitor () { return kind == Monitor ; }275 bool is_thread () { return kind == Thread ; }272 bool is_coroutine() const { return kind == Coroutine; } 273 bool is_generator() const { return kind == Generator; } 274 bool is_monitor () const { return kind == Monitor ; } 275 bool is_thread () const { return kind == Thread ; } 276 276 277 277 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } -
src/AST/Expr.cpp
r813dfd86 r295dd61 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed May 15 17:00:00 2019 11 // Last Modified By : Peter A. Buhr12 // Created On : T hr Jun 13 13:38:00 201913 // Update Count : 611 // Last Modified By : Andrew Beach 12 // Created On : Tue Nov 30 14:23:00 2021 13 // Update Count : 7 14 14 // 15 15 … … 141 141 /// The type of the address of a type. 142 142 /// Caller is responsible for managing returned memory 143 Type * addrType( const Type *type ) {144 if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * >( type) ) {145 return new ReferenceType { addrType( refType->base ), refType->qualifiers };143 Type * addrType( const ptr<Type> & type ) { 144 if ( auto refType = type.as< ReferenceType >() ) { 145 return new ReferenceType( addrType( refType->base ), refType->qualifiers ); 146 146 } else { 147 return new PointerType { type };147 return new PointerType( type ); 148 148 } 149 149 } 150 } 151 152 AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) : Expr( loc ), arg( a ) { 153 if ( arg->result ) { 154 if ( arg->get_lvalue() ) { 155 // lvalue, retains all levels of reference, and gains a pointer inside the references 156 Type * res = addrType( arg->result ); 157 result = res; 150 151 /// The type of the address of an expression. 152 /// Caller is responsible for managing returned memory 153 Type * addrExprType( const CodeLocation & loc, const Expr * arg ) { 154 assert( arg ); 155 // If the expression's type is unknown, the address type is unknown. 156 if ( nullptr == arg->result ) { 157 return nullptr; 158 // An lvalue is transformed directly. 159 } else if ( arg->get_lvalue() ) { 160 return addrType( arg->result ); 161 // Strip a layer of reference to "create" an lvalue expression. 162 } else if ( auto refType = arg->result.as< ReferenceType >() ) { 163 return addrType( refType->base ); 158 164 } else { 159 // taking address of non-lvalue, must be a reference, loses one layer of reference 160 if ( const ReferenceType * refType = 161 dynamic_cast< const ReferenceType * >( arg->result.get() ) ) { 162 Type * res = addrType( refType->base ); 163 result = res; 164 } else { 165 SemanticError( loc, arg->result.get(), 166 "Attempt to take address of non-lvalue expression: " ); 167 } 165 SemanticError( loc, arg->result.get(), 166 "Attempt to take address of non-lvalue expression: " ); 168 167 } 169 168 } 170 169 } 170 171 AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) : 172 Expr( loc, addrExprType( loc, a ) ), arg( a ) 173 {} 171 174 172 175 // --- LabelAddressExpr -
src/AST/Print.cpp
r813dfd86 r295dd61 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Print.cpp -- 7 // Print.cpp -- Print an AST (or sub-tree) to a stream. 8 8 // 9 9 // Author : Thierry Delisle -
src/AST/Print.hpp
r813dfd86 r295dd61 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Print.hpp -- 7 // Print.hpp -- Print an AST (or sub-tree) to a stream. 8 8 // 9 9 // Author : Thierry Delisle … … 35 35 template< typename Coll > 36 36 void printAll( std::ostream & os, const Coll & c, Indenter indent = {} ) { 37 for ( const auto & i : c ) {38 if ( ! i ) continue;39 40 os << indent;41 print( os, i, indent );42 os << std::endl;43 }37 for ( const auto & i : c ) { 38 if ( ! i ) continue; 39 40 os << indent; 41 print( os, i, indent ); 42 os << std::endl; 43 } 44 44 } 45 45
Note:
See TracChangeset
for help on using the changeset viewer.