If x is an invalid field decl, don't construct an expression for P->x, 
just silently return an error to avoid bogus diagnostics.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64491 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 628f233..6b82ead 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1571,6 +1571,12 @@
     } else
       MemberDecl = Result;
 
+    // If the decl being referenced had an error, return an error for this
+    // sub-expr without emitting another error, in order to avoid cascading
+    // error cases.
+    if (MemberDecl->isInvalidDecl())
+      return ExprError();
+
     if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) {
       // We may have found a field within an anonymous union or struct
       // (C++ [class.union]).
@@ -1623,6 +1629,12 @@
   // (*Obj).ivar.
   if (const ObjCInterfaceType *IFTy = BaseType->getAsObjCInterfaceType()) {
     if (ObjCIvarDecl *IV = IFTy->getDecl()->lookupInstanceVariable(&Member)) {
+      // If the decl being referenced had an error, return an error for this
+      // sub-expr without emitting another error, in order to avoid cascading
+      // error cases.
+      if (IV->isInvalidDecl())
+        return ExprError();
+      
       ObjCIvarRefExpr *MRef= new (Context) ObjCIvarRefExpr(IV, IV->getType(), 
                                                  MemberLoc, BaseExpr,
                                                  OpKind == tok::arrow);
diff --git a/test/Sema/exprs.c b/test/Sema/exprs.c
index db2daf1..4ddb976 100644
--- a/test/Sema/exprs.c
+++ b/test/Sema/exprs.c
@@ -57,3 +57,10 @@
   return R;
 }
 
+// PR3562
+void test10(int n,...) {
+  struct S {
+    double          a[n];  // expected-error {{fields must have a constant size}}
+  }               s;
+  double x = s.a[0];  // should not get another error here.
+}