ahatanak created this revision. ahatanak added reviewers: rjmccall, jordan_rose. ahatanak added a project: clang. Herald added a project: All. ahatanak requested review of this revision.
The assertion that is removed in this patch was failing when ObjC dot notation expressions appear in both sides of an assignment (see the test case in arc-repeated-weak.mm). Visit the `PseudoObjectExpr` once when the syntactic expression is visited and return without visiting the subexpressions when it's visited again when the semantic expressions are visited. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D139171 Files: clang/lib/AST/ParentMap.cpp clang/test/SemaObjC/arc-repeated-weak.mm Index: clang/test/SemaObjC/arc-repeated-weak.mm =================================================================== --- clang/test/SemaObjC/arc-repeated-weak.mm +++ clang/test/SemaObjC/arc-repeated-weak.mm @@ -290,6 +290,18 @@ } while(0); } +struct S { + int a; + id b; +}; + +@interface C +@property S p; +@end + +void test_list_init(C *c) { + c.p = {0, c.p.b}; +} @interface Test (Methods) @end Index: clang/lib/AST/ParentMap.cpp =================================================================== --- clang/lib/AST/ParentMap.cpp +++ clang/lib/AST/ParentMap.cpp @@ -33,9 +33,11 @@ switch (S->getStmtClass()) { case Stmt::PseudoObjectExprClass: { - assert(OVMode == OV_Transparent && "Should not appear alongside OVEs"); PseudoObjectExpr *POE = cast<PseudoObjectExpr>(S); + if (OVMode == OV_Opaque && M[POE->getSyntacticForm()]) + break; + // If we are rebuilding the map, clear out any existing state. if (M[POE->getSyntacticForm()]) for (Stmt *SubStmt : S->children())
Index: clang/test/SemaObjC/arc-repeated-weak.mm =================================================================== --- clang/test/SemaObjC/arc-repeated-weak.mm +++ clang/test/SemaObjC/arc-repeated-weak.mm @@ -290,6 +290,18 @@ } while(0); } +struct S { + int a; + id b; +}; + +@interface C +@property S p; +@end + +void test_list_init(C *c) { + c.p = {0, c.p.b}; +} @interface Test (Methods) @end Index: clang/lib/AST/ParentMap.cpp =================================================================== --- clang/lib/AST/ParentMap.cpp +++ clang/lib/AST/ParentMap.cpp @@ -33,9 +33,11 @@ switch (S->getStmtClass()) { case Stmt::PseudoObjectExprClass: { - assert(OVMode == OV_Transparent && "Should not appear alongside OVEs"); PseudoObjectExpr *POE = cast<PseudoObjectExpr>(S); + if (OVMode == OV_Opaque && M[POE->getSyntacticForm()]) + break; + // If we are rebuilding the map, clear out any existing state. if (M[POE->getSyntacticForm()]) for (Stmt *SubStmt : S->children())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits