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

Reply via email to