Disable __has_cpp_attribute when not compiling in C++ mode. As this feature test macro only supports C++ style attributes, it doesn't apply to code compiled as C code, and can lead to diagnostics when given a scoped attribute.

This addresses PR23435.

llvm-svn: 236996
This commit is contained in:
Aaron Ballman 2015-05-11 14:09:50 +00:00
parent d9ff035de8
commit 416b127456
2 changed files with 9 additions and 2 deletions
clang
lib/Lex
test/Preprocessor

View File

@ -283,7 +283,11 @@ void Preprocessor::RegisterBuiltinMacros() {
Ident_Pragma = RegisterBuiltinMacro(*this, "_Pragma");
// C++ Standing Document Extensions.
Ident__has_cpp_attribute = RegisterBuiltinMacro(*this, "__has_cpp_attribute");
if (LangOpts.CPlusPlus)
Ident__has_cpp_attribute =
RegisterBuiltinMacro(*this, "__has_cpp_attribute");
else
Ident__has_cpp_attribute = nullptr;
// GCC Extensions.
Ident__BASE_FILE__ = RegisterBuiltinMacro(*this, "__BASE_FILE__");

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -triple arm-unknown-linux -E %s -o - | FileCheck %s
// RUN: %clang_cc1 -triple arm-unknown-linux -verify -E %s -o - | FileCheck %s
// CHECK: always_inline
#if __has_attribute(always_inline)
@ -53,3 +53,6 @@ int has_no_volatile_attribute();
#if !__has_attribute(uuid)
int does_not_have_uuid
#endif
#if __has_cpp_attribute(selectany) // expected-error {{token is not a valid binary operator in a preprocessor subexpression}}
#endif