diff options
-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; |