Author: ygao Date: Fri Apr 11 15:55:19 2014 New Revision: 206069 URL: http://llvm.org/viewvc/llvm-project?rev=206069&view=rev Log: Add a test to distinguish between reserved tokens and normal identifiers.
The -fms-extensions option affects a number of subtle front-end C/C++ behaviors, and it would be useful to be able to distinguish MS keywords from regular identifiers in the ms-extensions mode even if the triple does not define a Windows target. It should make life easier if anyone needs to port their Windows codes to elsewhere. Differential Revision: http://reviews.llvm.org/D3034 Added: cfe/trunk/test/Lexer/keywords_test.c Modified: cfe/trunk/include/clang/Lex/Preprocessor.h cfe/trunk/lib/Lex/PPMacroExpansion.cpp Modified: cfe/trunk/include/clang/Lex/Preprocessor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=206069&r1=206068&r2=206069&view=diff ============================================================================== --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) +++ cfe/trunk/include/clang/Lex/Preprocessor.h Fri Apr 11 15:55:19 2014 @@ -125,6 +125,7 @@ class Preprocessor : public RefCountedBa IdentifierInfo *Ident__has_include; // __has_include IdentifierInfo *Ident__has_include_next; // __has_include_next IdentifierInfo *Ident__has_warning; // __has_warning + IdentifierInfo *Ident__is_identifier; // __is_identifier IdentifierInfo *Ident__building_module; // __building_module IdentifierInfo *Ident__MODULE__; // __MODULE__ Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=206069&r1=206068&r2=206069&view=diff ============================================================================== --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original) +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Fri Apr 11 15:55:19 2014 @@ -115,6 +115,7 @@ void Preprocessor::RegisterBuiltinMacros Ident__has_include = RegisterBuiltinMacro(*this, "__has_include"); Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next"); Ident__has_warning = RegisterBuiltinMacro(*this, "__has_warning"); + Ident__is_identifier = RegisterBuiltinMacro(*this, "__is_identifier"); // Modules. if (LangOpts.Modules) { @@ -1359,6 +1360,7 @@ void Preprocessor::ExpandBuiltinMacro(To } else if (II == Ident__has_feature || II == Ident__has_extension || II == Ident__has_builtin || + II == Ident__is_identifier || II == Ident__has_attribute) { // The argument to these builtins should be a parenthesized identifier. SourceLocation StartLoc = Tok.getLocation(); @@ -1382,6 +1384,8 @@ void Preprocessor::ExpandBuiltinMacro(To bool Value = false; if (!IsValid) Diag(StartLoc, diag::err_feature_check_malformed); + else if (II == Ident__is_identifier) + Value = FeatureII->getTokenID() == tok::identifier; else if (II == Ident__has_builtin) { // Check for a builtin is trivial. Value = FeatureII->getBuiltinID() != 0; Added: cfe/trunk/test/Lexer/keywords_test.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/keywords_test.c?rev=206069&view=auto ============================================================================== --- cfe/trunk/test/Lexer/keywords_test.c (added) +++ cfe/trunk/test/Lexer/keywords_test.c Fri Apr 11 15:55:19 2014 @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c99 -E %s -o - | FileCheck --check-prefix=CHECK-NONE %s + +// RUN: %clang_cc1 -std=gnu89 -E %s -o - \ +// RUN: | FileCheck --check-prefix=CHECK-GNU-KEYWORDS %s +// RUN: %clang_cc1 -std=c99 -fgnu-keywords -E %s -o - \ +// RUN: | FileCheck --check-prefix=CHECK-GNU-KEYWORDS %s +// RUN: %clang_cc1 -std=gnu89 -fno-gnu-keywords -E %s -o - \ +// RUN: | FileCheck --check-prefix=CHECK-NONE %s + +// RUN: %clang_cc1 -std=c99 -fms-extensions -E %s -o - \ +// RUN: | FileCheck --check-prefix=CHECK-MS-KEYWORDS %s + +void f() { +// CHECK-NONE: int asm +// CHECK-GNU-KEYWORDS: asm ("ret" : :) +#if __is_identifier(asm) + int asm; +#else + asm ("ret" : :); +#endif +} + +// CHECK-NONE: no_ms_wchar +// CHECK-MS-KEYWORDS: has_ms_wchar +#if __is_identifier(__wchar_t) +void no_ms_wchar(); +#else +void has_ms_wchar(); +#endif _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
