зеркало из https://github.com/microsoft/clang-1.git
Add support for attribute(deprecated), patch by Nuno Lopes!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47753 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
5c61e7a1fc
Коммит
7e669b2514
|
@ -61,6 +61,9 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
|
|||
if (!memcmp(Str, "annotate", 8)) return AT_annotate;
|
||||
if (!memcmp(Str, "noreturn", 8)) return AT_noreturn;
|
||||
break;
|
||||
case 10:
|
||||
if (!memcmp(Str, "deprecated", 10)) return AT_deprecated;
|
||||
break;
|
||||
case 11:
|
||||
if (!memcmp(Str, "vector_size", 11)) return AT_vector_size;
|
||||
break;
|
||||
|
|
|
@ -256,6 +256,8 @@ FunctionDecl *Sema::MergeFunctionDecl(FunctionDecl *New, ScopedDecl *OldD) {
|
|||
return New;
|
||||
}
|
||||
|
||||
// FIXME: propagate old Attrs to the New decl
|
||||
|
||||
QualType OldQType = Old->getCanonicalType();
|
||||
QualType NewQType = New->getCanonicalType();
|
||||
|
||||
|
@ -1778,6 +1780,9 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) {
|
|||
vDecl->setType(newType);
|
||||
}
|
||||
break;
|
||||
case AttributeList::AT_deprecated:
|
||||
New->addAttr(new DeprecatedAttr());
|
||||
break;
|
||||
case AttributeList::AT_aligned:
|
||||
HandleAlignedAttribute(New, Attr);
|
||||
break;
|
||||
|
@ -1791,7 +1796,11 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) {
|
|||
HandleNoReturnAttribute(New, Attr);
|
||||
break;
|
||||
default:
|
||||
// FIXME: add other attributes...
|
||||
#if 0
|
||||
// TODO: when we have the full set of attributes, warn about unknown ones.
|
||||
Diag(Attr->getLoc(), diag::warn_attribute_ignored,
|
||||
Attr->getName()->getName());
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -100,6 +100,10 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc,
|
|||
}
|
||||
}
|
||||
if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
|
||||
// check if referencing an identifier with __attribute__((deprecated)).
|
||||
if (VD->getAttr<DeprecatedAttr>())
|
||||
Diag(Loc, diag::warn_deprecated, VD->getName());
|
||||
|
||||
// Only create DeclRefExpr's for valid Decl's.
|
||||
if (VD->isInvalidDecl())
|
||||
return true;
|
||||
|
|
|
@ -26,7 +26,8 @@ public:
|
|||
Aligned,
|
||||
Packed,
|
||||
Annotate,
|
||||
NoReturn
|
||||
NoReturn,
|
||||
Deprecated
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -107,6 +108,16 @@ public:
|
|||
static bool classof(const NoReturnAttr *A) { return true; }
|
||||
};
|
||||
|
||||
class DeprecatedAttr : public Attr {
|
||||
public:
|
||||
DeprecatedAttr() : Attr(Deprecated) {}
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
|
||||
static bool classof(const Attr *A) { return A->getKind() == Deprecated; }
|
||||
static bool classof(const DeprecatedAttr *A) { return true; }
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
@ -617,6 +617,8 @@ DIAG(err_unexpected_typedef, ERROR,
|
|||
"unexpected type name '%0': expected expression")
|
||||
DIAG(err_undeclared_var_use, ERROR,
|
||||
"use of undeclared identifier '%0'")
|
||||
DIAG(warn_deprecated, WARNING,
|
||||
"'%0' is deprecated")
|
||||
DIAG(err_redefinition, ERROR,
|
||||
"redefinition of '%0'")
|
||||
DIAG(err_static_non_static, ERROR,
|
||||
|
|
|
@ -49,7 +49,8 @@ public:
|
|||
AT_aligned,
|
||||
AT_packed,
|
||||
AT_annotate,
|
||||
AT_noreturn
|
||||
AT_noreturn,
|
||||
AT_deprecated
|
||||
};
|
||||
|
||||
IdentifierInfo *getName() const { return AttrName; }
|
||||
|
|
Загрузка…
Ссылка в новой задаче