Diagnose missing macro argument following charize operator.

For completeness, add a test-case for the equivalent stringize operator
diagnostic too.

llvm-svn: 265177
This commit is contained in:
Andy Gibbs 2016-04-01 19:02:20 +00:00
parent dd711b93e0
commit 6f8cfccbd3
4 changed files with 19 additions and 4 deletions

View File

@ -387,7 +387,7 @@ def err_pp_expected_comma_in_arg_list : Error<
def err_pp_duplicate_name_in_arg_list : Error<
"duplicate macro parameter name %0">;
def err_pp_stringize_not_parameter : Error<
"'#' is not followed by a macro parameter">;
"'%select{#|#@}0' is not followed by a macro parameter">;
def err_pp_malformed_ident : Error<"invalid #ident directive">;
def err_pp_unterminated_conditional : Error<
"unterminated conditional directive">;

View File

@ -2151,7 +2151,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
while (Tok.isNot(tok::eod)) {
LastTok = Tok;
if (Tok.isNot(tok::hash) && Tok.isNot(tok::hashhash)) {
if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
MI->AddTokenToBody(Tok);
// Get the next token of the macro.
@ -2210,7 +2210,8 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok,
MI->AddTokenToBody(LastTok);
continue;
} else {
Diag(Tok, diag::err_pp_stringize_not_parameter);
Diag(Tok, diag::err_pp_stringize_not_parameter)
<< LastTok.is(tok::hashat);
// Disable __VA_ARGS__ again.
Ident__VA_ARGS__->setIsPoisoned(true);

View File

@ -35,6 +35,9 @@ void test_ms_alignof_alias(void) {
/* Charify extension. */
#define FOO(x) #@x
char x = FOO(a);
#define HASHAT #@
#define MISSING_ARG(x) #@
/* expected-error@-1 {{'#@' is not followed by a macro parameter}} */
typedef enum E { e1 };

View File

@ -1,4 +1,5 @@
// RUN: %clang_cc1 -E %s | FileCheck -strict-whitespace %s
#ifdef TEST1
// RUN: %clang_cc1 -E %s -DTEST1 | FileCheck -strict-whitespace %s
#define M(x, y) #x #y
@ -28,3 +29,13 @@ START_END( {a=1 , b=2;} ) /* braces are not parentheses */
M(a COMMA b, (a, b))
// CHECK: "a COMMA b" "(a, b)"
#endif
#ifdef TEST2
// RUN: %clang_cc1 -fsyntax-only -verify %s -DTEST2
#define HASH #
#define INVALID() #
// expected-error@-1{{'#' is not followed by a macro parameter}}
#endif