зеркало из https://github.com/microsoft/clang.git
Patch for adding message to unavailable attribute.
And its documentation. Finishes off // rdar: // 6734520. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115862 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4895b9cf34
Коммит
c784dc1caf
|
@ -23,6 +23,7 @@ td {
|
|||
<li><a href="#has_include">Include File Checking Macros</a></li>
|
||||
<li><a href="#builtinmacros">Builtin Macros</a></li>
|
||||
<li><a href="#vectors">Vectors and Extended Vectors</a></li>
|
||||
<li><a href="#deprecated">Deprecated and Unavailable attribute with Message</a></li>
|
||||
<li><a href="#checking_language_features">Checks for Standard Language Features</a></li>
|
||||
<ul>
|
||||
<li><a href="#cxx_exceptions">C++ exceptions</a></li>
|
||||
|
@ -266,6 +267,14 @@ float4 foo(float2 a, float2 b) {
|
|||
|
||||
<p>See also <a href="#__builtin_shufflevector">__builtin_shufflevector</a>.</p>
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<h2 id="deprecated">Deprecated and Unavailable attribute with Message</h2>
|
||||
<!-- ======================================================================= -->
|
||||
|
||||
<p> Optional string message can be added to Deprecated and Available attributes. </p>
|
||||
|
||||
<p> Message will be added to deprecated warning or unavailable error if present. </p>
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<h2 id="checking_language_features">Checks for Standard Language Features</h2>
|
||||
<!-- ======================================================================= -->
|
||||
|
|
|
@ -374,6 +374,7 @@ def TransparentUnion : Attr {
|
|||
|
||||
def Unavailable : Attr {
|
||||
let Spellings = ["unavailable"];
|
||||
let Args = [StringArgument<"Message">];
|
||||
}
|
||||
|
||||
def Unused : Attr {
|
||||
|
|
|
@ -1748,6 +1748,7 @@ def warn_deprecated : Warning<"%0 is deprecated">,
|
|||
def warn_deprecated_message : Warning<"%0 is deprecated: %1">,
|
||||
InGroup<DeprecatedDeclarations>;
|
||||
def err_unavailable : Error<"%0 is unavailable">;
|
||||
def err_unavailable_message : Error<"%0 is unavailable: %1">;
|
||||
def note_unavailable_here : Note<
|
||||
"function has been explicitly marked %select{unavailable|deleted}0 here">;
|
||||
def warn_not_enough_argument : Warning<
|
||||
|
|
|
@ -929,12 +929,26 @@ static void HandleDeprecatedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
|
|||
|
||||
static void HandleUnavailableAttr(Decl *d, const AttributeList &Attr, Sema &S) {
|
||||
// check the attribute arguments.
|
||||
if (Attr.getNumArgs() != 0) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
|
||||
int noArgs = Attr.getNumArgs();
|
||||
if (noArgs > 1) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0 or 1";
|
||||
return;
|
||||
}
|
||||
|
||||
d->addAttr(::new (S.Context) UnavailableAttr(Attr.getLoc(), S.Context));
|
||||
// Handle the case where unavailable attribute has a text message.
|
||||
StringLiteral *SE;
|
||||
if (noArgs == 1) {
|
||||
Expr *ArgExpr = static_cast<Expr *>(Attr.getArg(0));
|
||||
SE = dyn_cast<StringLiteral>(ArgExpr);
|
||||
if (!SE) {
|
||||
S.Diag(ArgExpr->getLocStart(),
|
||||
diag::err_attribute_not_string) << "unavailable";
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
SE = StringLiteral::CreateEmpty(S.Context, 1);
|
||||
d->addAttr(::new (S.Context) UnavailableAttr(Attr.getLoc(), S.Context,
|
||||
SE->getString()));
|
||||
}
|
||||
|
||||
static void HandleVisibilityAttr(Decl *d, const AttributeList &Attr, Sema &S) {
|
||||
|
|
|
@ -64,8 +64,12 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc) {
|
|||
}
|
||||
|
||||
// See if the decl is unavailable
|
||||
if (D->getAttr<UnavailableAttr>()) {
|
||||
Diag(Loc, diag::err_unavailable) << D->getDeclName();
|
||||
if (const UnavailableAttr *UA = D->getAttr<UnavailableAttr>()) {
|
||||
if (UA->getMessage().empty())
|
||||
Diag(Loc, diag::err_unavailable) << D->getDeclName();
|
||||
else
|
||||
Diag(Loc, diag::err_unavailable_message)
|
||||
<< D->getDeclName() << UA->getMessage().data();
|
||||
Diag(D->getLocation(), diag::note_unavailable_here) << 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// rdar: //6734520
|
||||
|
||||
int foo(int) __attribute__((__unavailable__("USE IFOO INSTEAD"))); // expected-note {{function has been explicitly marked unavailable here}}
|
||||
double dfoo(double) __attribute__((__unavailable__("NO LONGER"))); // expected-note 2 {{function has been explicitly marked unavailable here}}
|
||||
|
||||
void bar() __attribute__((__unavailable__)); // expected-note {{explicitly marked unavailable}}
|
||||
|
||||
void test_foo() {
|
||||
int ir = foo(1); // expected-error {{'foo' is unavailable: USE IFOO INSTEAD}}
|
||||
double dr = dfoo(1.0); // expected-error {{'dfoo' is unavailable: NO LONGER}}
|
||||
|
||||
void (*fp)() = &bar; // expected-error {{'bar' is unavailable}}
|
||||
|
||||
double (*fp4)(double) = dfoo; // expected-error {{'dfoo' is unavailable: NO LONGER}}
|
||||
}
|
Загрузка…
Ссылка в новой задаче