mirror of https://github.com/microsoft/clang.git
Diagnose missing macro argument following charize operator.
For completeness, add a test-case for the equivalent stringize operator diagnostic too. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@265177 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
882be36111
commit
c49579d6eb
|
@ -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">;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 };
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue