diff options
| author | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2014-03-18 17:55:18 +0000 | 
|---|---|---|
| committer | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2014-03-18 17:55:18 +0000 | 
| commit | fcdc45ff2df34f38bde572ed3d5d2481edd03deb (patch) | |
| tree | 71eeda2f28aec4150d29fbf8e845feba10c10412 | |
| parent | a9dafe679319112d26c1d2edb1bb26952c2983db (diff) | |
| download | bcm5719-llvm-fcdc45ff2df34f38bde572ed3d5d2481edd03deb.tar.gz bcm5719-llvm-fcdc45ff2df34f38bde572ed3d5d2481edd03deb.zip  | |
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
llvm-svn: 204164
| -rw-r--r-- | clang/include/clang/AST/PrettyPrinter.h | 6 | ||||
| -rw-r--r-- | clang/include/clang/Basic/LangOptions.def | 1 | ||||
| -rw-r--r-- | clang/include/clang/Basic/TokenKinds.def | 3 | ||||
| -rw-r--r-- | clang/lib/AST/Type.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Basic/IdentifierTable.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CXX/expr/expr.const/p2-0x.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Sema/variadic-promotion.c | 2 | 
8 files changed, 16 insertions, 5 deletions
diff --git a/clang/include/clang/AST/PrettyPrinter.h b/clang/include/clang/AST/PrettyPrinter.h index 37a4df7250c..8f89379d4a0 100644 --- a/clang/include/clang/AST/PrettyPrinter.h +++ b/clang/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/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index bb2f1e4ec20..22662e0db6c 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/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/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index 2ffd0001318..42ebcf8e9e1 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/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/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 32e7b020d5e..dc3fcc8c78b 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/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/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 09a0e6bbbdc..0993b2335e4 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/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/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 7cc0b1bee30..79d81511c37 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/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/clang/test/CXX/expr/expr.const/p2-0x.cpp b/clang/test/CXX/expr/expr.const/p2-0x.cpp index f0b53c7d3b5..84688278f0d 100644 --- a/clang/test/CXX/expr/expr.const/p2-0x.cpp +++ b/clang/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/clang/test/Sema/variadic-promotion.c b/clang/test/Sema/variadic-promotion.c index b2487744305..01d8e934b4e 100644 --- a/clang/test/Sema/variadic-promotion.c +++ b/clang/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' <FloatingCast> -// CHECK-NEXT: 'half' +// CHECK-NEXT: '__fp16'  // CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast>  // CHECK-NEXT: 'float'  | 

