Changeset ae265b5 for src/AST/Expr.cpp
- Timestamp:
- Aug 7, 2019, 5:08:58 PM (3 years ago)
- Branches:
- arm-eh, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- ba417e2, c570806
- Parents:
- 2890212
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.cpp
r2890212 rae265b5 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
Note: See TracChangeset
for help on using the changeset viewer.