Changeset ba417e2
- Timestamp:
- Aug 8, 2019, 11:51:16 AM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 92a6e02
- Parents:
- f49b3fc (diff), ae265b55 (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:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
rf49b3fc rba417e2 2124 2124 old->location, 2125 2125 GET_ACCEPT_1(member, DeclWithType), 2126 GET_ACCEPT_1(aggregate, Expr) 2126 GET_ACCEPT_1(aggregate, Expr), 2127 ast::MemberExpr::NoOpConstructionChosen 2127 2128 ) 2128 2129 ); -
src/AST/Expr.cpp
rf49b3fc rba417e2 158 158 assert( aggregate->result ); 159 159 160 // take ownership of member type 161 result = mem->get_type(); 160 // Deep copy on result type avoids mutation on transitively multiply referenced object. 161 // 162 // Example, adapted from parts of builtins and bootloader: 163 // 164 // forall(dtype T) 165 // struct __Destructor { 166 // T * object; 167 // void (*dtor)(T *); 168 // }; 169 // 170 // forall(dtype S) 171 // void foo(__Destructor(S) &d) { 172 // if (d.dtor) { // here 173 // } 174 // } 175 // 176 // Let e be the "d.dtor" guard espression, which is MemberExpr after resolve. Let d be the 177 // declaration of member __Destructor.dtor (an ObjectDecl), as accessed via the top-level 178 // declaration of __Destructor. Consider the types e.result and d.type. In the old AST, one 179 // is a clone of the other. Ordinary new-AST use would set them up as a multiply-referenced 180 // object. 181 // 182 // e.result: PointerType 183 // .base: FunctionType 184 // .params.front(): ObjectDecl, the anonymous parameter of type T* 185 // .type: PointerType 186 // .base: TypeInstType 187 // let x = that 188 // let y = similar, except start from d.type 189 // 190 // Consider two code lines down, genericSubstitution(...).apply(result). 191 // 192 // Applying this chosen-candidate's type substitution means modifying x, substituting 193 // S for T. This mutation should affect x and not y. 194 195 result = deepCopy(mem->get_type()); 196 162 197 // substitute aggregate generic parameters into member type 163 198 genericSubstitution( aggregate->result ).apply( result ); 164 199 // ensure lvalue and appropriate restrictions from aggregate type 165 200 add_qualifiers( result, aggregate->result->qualifiers | CV::Lvalue ); 201 } 202 203 MemberExpr::MemberExpr( const CodeLocation & loc, const DeclWithType * mem, const Expr * agg, 204 MemberExpr::NoOpConstruction overloadSelector ) 205 : Expr( loc ), member( mem ), aggregate( agg ) { 206 assert( member ); 207 assert( aggregate ); 208 assert( aggregate->result ); 209 (void) overloadSelector; 166 210 } 167 211 -
src/AST/Expr.hpp
rf49b3fc rba417e2 358 358 MemberExpr * clone() const override { return new MemberExpr{ *this }; } 359 359 MUTATE_FRIEND 360 361 // Custructor overload meant only for AST conversion 362 enum NoOpConstruction { NoOpConstructionChosen }; 363 MemberExpr( const CodeLocation & loc, const DeclWithType * mem, const Expr * agg, 364 NoOpConstruction overloadSelector ); 365 friend class ::ConverterOldToNew; 366 friend class ::ConverterNewToOld; 360 367 }; 361 368
Note: See TracChangeset
for help on using the changeset viewer.