]> granicus.if.org Git - clang/commitdiff
Creating a printing policy for "half":
authorYunzhong Gao <Yunzhong_Gao@playstation.sony.com>
Tue, 18 Mar 2014 17:55:18 +0000 (17:55 +0000)
committerYunzhong Gao <Yunzhong_Gao@playstation.sony.com>
Tue, 18 Mar 2014 17:55:18 +0000 (17:55 +0000)
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
include/clang/Basic/LangOptions.def
include/clang/Basic/TokenKinds.def
lib/AST/Type.cpp
lib/Basic/IdentifierTable.cpp
lib/Frontend/CompilerInvocation.cpp
test/CXX/expr/expr.const/p2-0x.cpp
test/Sema/variadic-promotion.c

index 37a4df7250c06074aac72f7fb1db3b1fcb24bee2..8f89379d4a0d6b553df6e39747bb1eab2b2cbd58 100644 (file)
@@ -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;
index bb2f1e4ec20f07efaae501da2f1da0a9817ebf29..22662e0db6c26c7f911e1804d6ea4a998d197453 100644 (file)
@@ -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")
index 2ffd0001318d65e7f9257974b5660c9c1ba0cf96..42ebcf8e9e11c3da826ef4cdbf5253426dc8809e 100644 (file)
@@ -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)
index 32e7b020d5eb8ad671bcc4e94c4265229e7e9048..dc3fcc8c78b2ac6a98e6def1fa7b5f55392a189f 100644 (file)
@@ -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";
index 09a0e6bbbdc80e043ca22b98be1dddfafbbd2099..0993b2335e4bc19b39dc0b1cb31dd26cd3d0d90a 100644 (file)
@@ -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;
index 7cc0b1bee30b897de608bc53f67c98c92245810a..79d81511c3779443d367c289759ee18d2780a1be 100644 (file)
@@ -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;
 
index f0b53c7d3b5ccf6c71a1a5d65d99a6e5bf3d5127..84688278f0da88946a018c7f453c307886030582 100644 (file)
@@ -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;
     }
   }
index b24877443052ccbe89b55bf5109b5add8b31a191..01d8e934b4eb1f6d58df59bdf93d5738c4a53ec5 100644 (file)
@@ -6,7 +6,7 @@ void test_floating_promotion(__fp16 *f16, float f32, double f64) {
   variadic(3, *f16, f32, f64);
 
 // CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast>
-// CHECK-NEXT: 'half'
+// CHECK-NEXT: '__fp16'
 
 // CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast>
 // CHECK-NEXT: 'float'