Index: lib/Lex/Lexer.cpp =================================================================== --- lib/Lex/Lexer.cpp +++ lib/Lex/Lexer.cpp @@ -1354,7 +1354,9 @@ } static bool isAllowedIDChar(uint32_t C, const LangOptions &LangOpts) { - if (LangOpts.CPlusPlus11 || LangOpts.C11) { + if (LangOpts.AsmPreprocessor) { + return false; + } else if (LangOpts.CPlusPlus11 || LangOpts.C11) { static const llvm::sys::UnicodeCharSet C11AllowedIDChars( C11AllowedIDCharRanges); return C11AllowedIDChars.contains(C); @@ -1371,7 +1373,9 @@ static bool isAllowedInitiallyIDChar(uint32_t C, const LangOptions &LangOpts) { assert(isAllowedIDChar(C, LangOpts)); - if (LangOpts.CPlusPlus11 || LangOpts.C11) { + if (LangOpts.AsmPreprocessor) { + return false; + } else if (LangOpts.CPlusPlus11 || LangOpts.C11) { static const llvm::sys::UnicodeCharSet C11DisallowedInitialIDChars( C11DisallowedInitialIDCharRanges); return !C11DisallowedInitialIDChars.contains(C); Index: test/CodeGen/asm-unicode.S =================================================================== --- /dev/null +++ test/CodeGen/asm-unicode.S @@ -0,0 +1,12 @@ +// RUN: %clang -S %s -o - | FileCheck %s +.macro my_macro, trace=1, uaccess=1 +.if \uaccess +// CHECK: .if \uaccess +// CHECK-NOT: .if 곎ss +// CHECK: my_macro trace=1 + my_macro trace=1 +.endif +.endm + +foo: + my_macro trace=0 Index: test/CodeGen/c-unicode.c =================================================================== --- /dev/null +++ test/CodeGen/c-unicode.c @@ -0,0 +1,7 @@ +// RUN: %clang -S %s -o - | FileCheck %s -check-prefix=ALLOWED +// RUN: not %clang -std=c89 -S %s -o - 2>&1 | FileCheck %s -check-prefix=DENIED +int \uaccess = 0; +// ALLOWED: "곎ss": +// ALLOWED-NOT: "\uaccess": +// DENIED: warning: universal character names are only valid in C99 or C++; treating as '\' followed by identifier [-Wunicode] +// DENIED: error: expected identifier or '('