From: Andy Gibbs Date: Sat, 17 Nov 2012 19:18:27 +0000 (+0000) Subject: Prevent premature macro expansion in __has_builtin, __has_feature, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3f03b586351779be6947466f530f22c491b1b70f;p=clang Prevent premature macro expansion in __has_builtin, __has_feature, __has_attribute, __has_extension, making them behave more akin to conventional macros. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@168268 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 6baa593e78..1e77317d3e 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -1228,15 +1228,15 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { IdentifierInfo *FeatureII = 0; // Read the '('. - Lex(Tok); + LexUnexpandedToken(Tok); if (Tok.is(tok::l_paren)) { // Read the identifier - Lex(Tok); + LexUnexpandedToken(Tok); if (Tok.is(tok::identifier) || Tok.is(tok::kw_const)) { FeatureII = Tok.getIdentifierInfo(); // Read the ')'. - Lex(Tok); + LexUnexpandedToken(Tok); if (Tok.is(tok::r_paren)) IsValid = true; } diff --git a/test/Preprocessor/feature_tests.c b/test/Preprocessor/feature_tests.c index b78a2517b1..19d80468ab 100644 --- a/test/Preprocessor/feature_tests.c +++ b/test/Preprocessor/feature_tests.c @@ -32,3 +32,23 @@ __has_builtin(__builtin_altivec_abs_v4sf) #error Broken handling of target-specific builtins #endif + +// Macro expansion does not occur in the parameter to __has_builtin, +// __has_feature, etc. (as is also expected behaviour for ordinary +// macros), so the following should not expand: + +#define MY_ALIAS_BUILTIN __c11_atomic_init +#define MY_ALIAS_FEATURE attribute_overloadable + +#if __has_builtin(MY_ALIAS_BUILTIN) || __has_feature(MY_ALIAS_FEATURE) +#error Alias expansion not allowed +#endif + +// But deferring should expand: + +#define HAS_BUILTIN(X) __has_builtin(X) +#define HAS_FEATURE(X) __has_feature(X) + +#if !HAS_BUILTIN(MY_ALIAS_BUILTIN) || !HAS_FEATURE(MY_ALIAS_FEATURE) +#error Expansion should have occurred +#endif