From 553905db4c758883345efa3c4c07e1dba2c74a2f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 16 Feb 2009 17:19:12 +0000 Subject: [PATCH] add support for deprecated objc ivars. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64637 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 9 +++++++++ test/Sema/attr-deprecated.c | 1 + test/SemaObjC/attr-deprecated.m | 6 +++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 66f33c1ea2..49bba1d5b8 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -600,6 +600,9 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, if (D == 0 || D->isDefinedOutsideFunctionOrMethod()) { ObjCInterfaceDecl *IFace = getCurMethodDecl()->getClassInterface(); if (ObjCIvarDecl *IV = IFace->lookupInstanceVariable(II)) { + // Check if referencing a field with __attribute__((deprecated)). + DiagnoseUseOfDeprecatedDecl(IV, Loc); + // FIXME: This should use a new expr for a direct reference, don't turn // this into Self->ivar, just return a BareIVarExpr or something. IdentifierInfo &II = Context.Idents.get("self"); @@ -771,6 +774,9 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, DiagnoseUseOfDeprecatedDecl(VD, Loc); if (VarDecl *Var = dyn_cast(VD)) { + // Warn about constructs like: + // if (void *X = foo()) { ... } else { X }. + // In the else block, the pointer is always false. if (Var->isDeclaredInCondition() && Var->getType()->isScalarType()) { Scope *CheckS = S; while (CheckS) { @@ -1654,6 +1660,9 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, if (IV->isInvalidDecl()) return ExprError(); + // Check if referencing a field with __attribute__((deprecated)). + DiagnoseUseOfDeprecatedDecl(IV, MemberLoc); + ObjCIvarRefExpr *MRef= new (Context) ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr, OpKind == tok::arrow); diff --git a/test/Sema/attr-deprecated.c b/test/Sema/attr-deprecated.c index f4ec0bc278..f7c96b0f6d 100644 --- a/test/Sema/attr-deprecated.c +++ b/test/Sema/attr-deprecated.c @@ -40,3 +40,4 @@ struct foo { void test1(struct foo *F) { ++F->x; // expected-warning {{'x' is deprecated}} } + diff --git a/test/SemaObjC/attr-deprecated.m b/test/SemaObjC/attr-deprecated.m index d46503e148..767206f88b 100644 --- a/test/SemaObjC/attr-deprecated.m +++ b/test/SemaObjC/attr-deprecated.m @@ -1,6 +1,8 @@ // RUN: clang %s -fsyntax-only -verify -@interface A +@interface A { + int X __attribute__((deprecated)); +} + (void)F __attribute__((deprecated)); - (void)f __attribute__((deprecated)); @end @@ -13,6 +15,8 @@ - (void)g { + X++; // expected-warning{{'X' is deprecated}} + self->X++; // expected-warning{{'X' is deprecated}} [self f]; // expected-warning{{'f' is deprecated}} } -- 2.40.0