forked from OSchip/llvm-project
If x is an invalid field decl, don't construct an expression for P->x,
just silently return an error to avoid bogus diagnostics. llvm-svn: 64491
This commit is contained in:
parent
2fd18ec43a
commit
303284acfc
|
@ -1571,6 +1571,12 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
|
||||||
} else
|
} else
|
||||||
MemberDecl = Result;
|
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)) {
|
if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) {
|
||||||
// We may have found a field within an anonymous union or struct
|
// We may have found a field within an anonymous union or struct
|
||||||
// (C++ [class.union]).
|
// (C++ [class.union]).
|
||||||
|
@ -1623,6 +1629,12 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
|
||||||
// (*Obj).ivar.
|
// (*Obj).ivar.
|
||||||
if (const ObjCInterfaceType *IFTy = BaseType->getAsObjCInterfaceType()) {
|
if (const ObjCInterfaceType *IFTy = BaseType->getAsObjCInterfaceType()) {
|
||||||
if (ObjCIvarDecl *IV = IFTy->getDecl()->lookupInstanceVariable(&Member)) {
|
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(),
|
ObjCIvarRefExpr *MRef= new (Context) ObjCIvarRefExpr(IV, IV->getType(),
|
||||||
MemberLoc, BaseExpr,
|
MemberLoc, BaseExpr,
|
||||||
OpKind == tok::arrow);
|
OpKind == tok::arrow);
|
||||||
|
|
|
@ -57,3 +57,10 @@ int test9(struct f *P) {
|
||||||
return R;
|
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.
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue