diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-02-18 06:49:31 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-02-18 06:49:31 +0000 |
commit | 046ba5b66faea26fb0ef36b48a07e9c0fc08970c (patch) | |
tree | 93a6614926f09537909be0510ec276ff5c75dab5 /clang | |
parent | bc24cb5fb53753fcf643a33885ba04b3c6f32041 (diff) | |
download | bcm5719-llvm-046ba5b66faea26fb0ef36b48a07e9c0fc08970c.tar.gz bcm5719-llvm-046ba5b66faea26fb0ef36b48a07e9c0fc08970c.zip |
Sema: provide an extension warning for enable_if
Clang implements an enable_if attribute as an extension. Hook up `-Wpedantic`
to issue an extension usage warning when __enable_if__ is used.
llvm-svn: 261192
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticCommonKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 2 | ||||
-rw-r--r-- | clang/test/Sema/enable_if-ext.c | 50 |
3 files changed, 54 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td index ccc271a69f9..837fc6126e8 100644 --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -157,6 +157,8 @@ def ext_old_implicitly_unsigned_long_cxx : ExtWarn< "this literal will %select{have type 'long long'|be ill-formed}0 " "in C++11 onwards">, InGroup<CXX11Compat>; +def ext_clang_enable_if : Extension<"'enable_if' is a clang extension">, + InGroup<GccCompat>; // SEH def err_seh_expected_handler : Error< diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index bfb82ac1388..d2db4b92849 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -804,6 +804,8 @@ static void handleLocksExcludedAttr(Sema &S, Decl *D, } static void handleEnableIfAttr(Sema &S, Decl *D, const AttributeList &Attr) { + S.Diag(Attr.getLoc(), diag::ext_clang_enable_if); + Expr *Cond = Attr.getArgAsExpr(0); if (!Cond->isTypeDependent()) { ExprResult Converted = S.PerformContextuallyConvertToBool(Cond); diff --git a/clang/test/Sema/enable_if-ext.c b/clang/test/Sema/enable_if-ext.c new file mode 100644 index 00000000000..1e605d49b60 --- /dev/null +++ b/clang/test/Sema/enable_if-ext.c @@ -0,0 +1,50 @@ +// RUN: %clang_cc1 -fsyntax-only %s -include %s -verify +// RUN: %clang_cc1 -Wpedantic -fsyntax-only %s -include %s -verify -DWARN_PEDANTIC + +#ifndef enable_if_ext_included +#define enable_if_ext_included + +#if !defined(WARN_PEDANTIC) +// expected-no-diagnostics +#endif + +__attribute__ (( enable_if(1, "") )) +#if defined(WARN_PEDANTIC) +// expected-warning@-2 {{'enable_if' is a clang extension}} +#endif +void f() { } + +__attribute__ (( __enable_if__(1, "") )) +#if defined(WARN_PEDANTIC) +// expected-warning@-2 {{'enable_if' is a clang extension}} +#endif +void g() { } + +__attribute__ (( enable_if(0, "") )) +#if defined(WARN_PEDANTIC) +// expected-warning@-2 {{'enable_if' is a clang extension}} +#endif +void h() { } + +__attribute__ (( __enable_if__(0, "") )) +#if defined(WARN_PEDANTIC) +// expected-warning@-2 {{'enable_if' is a clang extension}} +#endif +void i() { } + +#pragma clang system_header + +__attribute__ (( enable_if(1, "") )) +void j() { } + +__attribute__ (( __enable_if__(1, "") )) +void k() { } + +__attribute__ (( enable_if(0, "") )) +void l() { } + +__attribute__ (( __enable_if__(0, "") )) +void m() { } + +#endif + |