From d41d09424487d386b780986a030d9915af4fdee1 Mon Sep 17 00:00:00 2001 From: Andy Gibbs Date: Sat, 17 Nov 2012 19:18:27 +0000 Subject: [PATCH] Prevent premature macro expansion in __has_builtin, __has_feature, __has_attribute, __has_extension, making them behave more akin to conventional macros. llvm-svn: 168268 --- clang/lib/Lex/PPMacroExpansion.cpp | 6 +++--- clang/test/Preprocessor/feature_tests.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 6baa593e788e..1e77317d3e0f 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/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/clang/test/Preprocessor/feature_tests.c b/clang/test/Preprocessor/feature_tests.c index b78a2517b18d..19d80468ab3f 100644 --- a/clang/test/Preprocessor/feature_tests.c +++ b/clang/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