diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-24 22:30:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-24 22:30:50 +0000 |
commit | 5cb10d3b1ad546b232e72275eaaf56d72823901d (patch) | |
tree | 8c2421abd29ea838443a47c96dd952c05dac9958 | |
parent | 27a4566734582b81abbf9af8a949a9049098d344 (diff) |
fix the sizeof error recovery issue (sizeof-interface.m:attributeRuns)
by correctly propagating the fact that the type was invalid up to the
attributeRuns decl, then returning an ExprError when attributeRuns is
formed (like we do for normal declrefexprs).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69998 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 1 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 18 |
3 files changed, 14 insertions, 7 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 938e965556..8268452430 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -2579,6 +2579,7 @@ void Parser::ParseBracketDeclarator(Declarator &D) { // If there was an error parsing the assignment-expression, recover. if (NumElements.isInvalid()) { + D.setInvalidType(true); // If the expression was invalid, skip it. SkipUntil(tok::r_square); return; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 63b006277c..e2f0ea4158 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3820,7 +3820,7 @@ Sema::DeclPtrTy Sema::ActOnIvar(Scope *S, // example, unnamed unions inject all members into the struct namespace! QualType T = GetTypeForDeclarator(D, S); - bool InvalidDecl = false; + bool InvalidDecl = D.getInvalidType(); if (T.isNull()) { InvalidDecl = true; T = Context.IntTy; diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 949c4ae664..53fe80cb72 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -669,14 +669,14 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, LookupResult Lookup = LookupParsedName(S, SS, Name, LookupOrdinaryName, false, true, Loc); - NamedDecl *D = 0; if (Lookup.isAmbiguous()) { DiagnoseAmbiguousLookup(Lookup, Name, Loc, SS && SS->isSet() ? SS->getRange() : SourceRange()); return ExprError(); - } else - D = Lookup.getAsDecl(); + } + + NamedDecl *D = Lookup.getAsDecl(); // If this reference is in an Objective-C method, then ivar lookup happens as // well. @@ -695,6 +695,12 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, // Check if referencing a field with __attribute__((deprecated)). if (DiagnoseUseOfDecl(IV, Loc)) return ExprError(); + + // If we're referencing an invalid decl, just return this as a silent + // error node. The error diagnostic was already emitted on the decl. + if (IV->isInvalidDecl()) + return ExprError(); + bool IsClsMethod = getCurMethodDecl()->isClassMethod(); // If a class method attemps to use a free standing ivar, this is // an error. @@ -726,7 +732,7 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, ClassDeclared)) { if (IV->getAccessControl() != ObjCIvarDecl::Private || IFace == ClassDeclared) - Diag(Loc, diag::warn_ivar_use_hidden)<<IV->getDeclName(); + Diag(Loc, diag::warn_ivar_use_hidden) << IV->getDeclName(); } } // Needed to implement property "super.method" notation. @@ -1253,8 +1259,8 @@ bool Sema::CheckSizeOfAlignOfOperand(QualType exprType, // Reject sizeof(interface) and sizeof(interface<proto>) in 64-bit mode. if (LangOpts.ObjCNonFragileABI && exprType->isObjCInterfaceType()) { Diag(OpLoc, diag::err_sizeof_nonfragile_interface) - << exprType << isSizeof; - return false; + << exprType << isSizeof << ExprRange; + return true; } return false; |