From: Chris Lattner Date: Fri, 13 Feb 2009 22:08:30 +0000 (+0000) Subject: If x is an invalid field decl, don't construct an expression for P->x, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=56cd21bd52aed7a32f3ff11b7e480f664d0b4262;p=clang 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 628f233d68..6b82eadaea 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1571,6 +1571,12 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, } 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(MemberDecl)) { // We may have found a field within an anonymous union or struct // (C++ [class.union]). @@ -1623,6 +1629,12 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, // (*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 db2daf1f7c..4ddb976eb2 100644 --- a/test/Sema/exprs.c +++ b/test/Sema/exprs.c @@ -57,3 +57,10 @@ int test9(struct f *P) { 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. +}