From 8cd1d73f00a73eb9fb316b2aa808a153d5aca50c Mon Sep 17 00:00:00 2001 From: Yunzhong Gao Date: Tue, 18 Mar 2014 17:55:18 +0000 Subject: [PATCH] Creating a printing policy for "half": Since "half" is an OpenCL keyword and clang accepts __fp16 as an extension for other languages, error messages and metadata (and hence debug info) should refer to the half-precision floating point as "__fp16" instead of "half" when compiling for non-OpenCL languages. This patch creates a new printing policy for half in a similar manner to what is done for bool and wchar_t. Differential Revision: http://llvm-reviews.chandlerc.com/D2952 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204164 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/PrettyPrinter.h | 6 +++++- include/clang/Basic/LangOptions.def | 1 + include/clang/Basic/TokenKinds.def | 3 ++- lib/AST/Type.cpp | 2 +- lib/Basic/IdentifierTable.cpp | 2 ++ lib/Frontend/CompilerInvocation.cpp | 3 +++ test/CXX/expr/expr.const/p2-0x.cpp | 2 +- test/Sema/variadic-promotion.c | 2 +- 8 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/clang/AST/PrettyPrinter.h b/include/clang/AST/PrettyPrinter.h index 37a4df7250..8f89379d4a 100644 --- a/include/clang/AST/PrettyPrinter.h +++ b/include/clang/AST/PrettyPrinter.h @@ -41,7 +41,7 @@ struct PrintingPolicy { ConstantArraySizeAsWritten(false), AnonymousTagLocations(true), SuppressStrongLifetime(false), SuppressLifetimeQualifiers(false), Bool(LO.Bool), TerseOutput(false), PolishForDeclaration(false), - MSWChar(LO.MicrosoftExt && !LO.WChar), + Half(LO.Half), MSWChar(LO.MicrosoftExt && !LO.WChar), IncludeNewlines(true) { } /// \brief What language we're printing. @@ -153,6 +153,10 @@ struct PrintingPolicy { /// unsigned PolishForDeclaration : 1; + /// \brief When true, print the half-precision floating-point type as 'half' + /// instead of '__fp16' + unsigned Half : 1; + /// \brief When true, print the built-in wchar_t type as __wchar_t. For use in /// Microsoft mode when wchar_t is not available. unsigned MSWChar : 1; diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index bb2f1e4ec2..22662e0db6 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -61,6 +61,7 @@ BENIGN_LANGOPT(ObjCInferRelatedResultType , 1, 1, LANGOPT(Trigraphs , 1, 0,"trigraphs") LANGOPT(LineComment , 1, 0, "'//' comments") LANGOPT(Bool , 1, 0, "bool, true, and false keywords") +LANGOPT(Half , 1, 0, "half keyword") LANGOPT(WChar , 1, CPlusPlus, "wchar_t keyword") BENIGN_LANGOPT(DollarIdents , 1, 1, "'$' in identifiers") BENIGN_LANGOPT(AsmPreprocessor, 1, 0, "preprocessor in asm mode") diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index 2ffd000131..42ebcf8e9e 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/include/clang/Basic/TokenKinds.def @@ -229,6 +229,7 @@ PUNCTUATOR(greatergreatergreater, ">>>") // KEYALTIVEC - This is a keyword in AltiVec // KEYBORLAND - This is a keyword if Borland extensions are enabled // BOOLSUPPORT - This is a keyword if 'bool' is a built-in type +// HALFSUPPORT - This is a keyword if 'half' is a built-in type // WCHARSUPPORT - This is a keyword if 'wchar_t' is a built-in type // KEYWORD(auto , KEYALL) @@ -492,7 +493,7 @@ KEYWORD(__pixel , KEYALTIVEC) ALIAS("__fp16", half , KEYALL) // OpenCL Extension. -KEYWORD(half , KEYOPENCL) +KEYWORD(half , HALFSUPPORT) // Objective-C ARC keywords. KEYWORD(__bridge , KEYARC) diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 32e7b020d5..dc3fcc8c78 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -1523,7 +1523,7 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const { case ULong: return "unsigned long"; case ULongLong: return "unsigned long long"; case UInt128: return "unsigned __int128"; - case Half: return "half"; + case Half: return Policy.Half ? "half" : "__fp16"; case Float: return "float"; case Double: return "double"; case LongDouble: return "long double"; diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp index 09a0e6bbbd..0993b2335e 100644 --- a/lib/Basic/IdentifierTable.cpp +++ b/lib/Basic/IdentifierTable.cpp @@ -105,6 +105,7 @@ namespace { KEYARC = 0x800, KEYNOMS = 0x01000, WCHARSUPPORT = 0x02000, + HALFSUPPORT = 0x04000, KEYALL = (0xffff & ~KEYNOMS) // Because KEYNOMS is used to exclude. }; } @@ -129,6 +130,7 @@ static void AddKeyword(StringRef Keyword, else if (LangOpts.MicrosoftExt && (Flags & KEYMS)) AddResult = 1; else if (LangOpts.Borland && (Flags & KEYBORLAND)) AddResult = 1; else if (LangOpts.Bool && (Flags & BOOLSUPPORT)) AddResult = 2; + else if (LangOpts.Half && (Flags && HALFSUPPORT)) AddResult = 2; else if (LangOpts.WChar && (Flags & WCHARSUPPORT)) AddResult = 2; else if (LangOpts.AltiVec && (Flags & KEYALTIVEC)) AddResult = 2; else if (LangOpts.OpenCL && (Flags & KEYOPENCL)) AddResult = 2; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 7cc0b1bee3..79d81511c3 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1116,6 +1116,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, // OpenCL and C++ both have bool, true, false keywords. Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; + // OpenCL has half keyword + Opts.Half = Opts.OpenCL; + // C++ has wchar_t keyword. Opts.WChar = Opts.CPlusPlus; diff --git a/test/CXX/expr/expr.const/p2-0x.cpp b/test/CXX/expr/expr.const/p2-0x.cpp index f0b53c7d3b..84688278f0 100644 --- a/test/CXX/expr/expr.const/p2-0x.cpp +++ b/test/CXX/expr/expr.const/p2-0x.cpp @@ -138,7 +138,7 @@ namespace UndefinedBehavior { case (int)(unsigned)(long long)4.4e9: // ok case (int)(float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}} expected-error {{duplicate case value '2147483647'}} expected-note {{previous case defined here}} case (int)((float)1e37 / 1e30): // ok - case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type 'half'}} expected-error {{duplicate case value '2147483647'}} + case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type '__fp16'}} expected-error {{duplicate case value '2147483647'}} break; } } diff --git a/test/Sema/variadic-promotion.c b/test/Sema/variadic-promotion.c index b248774430..01d8e934b4 100644 --- a/test/Sema/variadic-promotion.c +++ b/test/Sema/variadic-promotion.c @@ -6,7 +6,7 @@ void test_floating_promotion(__fp16 *f16, float f32, double f64) { variadic(3, *f16, f32, f64); // CHECK: ImplicitCastExpr {{.*}} 'double' -// CHECK-NEXT: 'half' +// CHECK-NEXT: '__fp16' // CHECK: ImplicitCastExpr {{.*}} 'double' // CHECK-NEXT: 'float' -- 2.40.0