r303813 - Revert "Sema: allow imaginary constants via GNU extension if UDL overloads not present."

Tim Northover via cfe-commits cfe-commits at lists.llvm.org
Wed May 24 15:18:36 PDT 2017


Author: tnorthover
Date: Wed May 24 17:18:35 2017
New Revision: 303813

URL: http://llvm.org/viewvc/llvm-project?rev=303813&view=rev
Log:
Revert "Sema: allow imaginary constants via GNU extension if UDL overloads not present."

This reverts commit r303697. It broke libc++ tests that were specifically
checking incompatibility in C++14 mode.

Removed:
    cfe/trunk/test/SemaCXX/imaginary-constants.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/include/clang/Sema/Sema.h
    cfe/trunk/lib/Lex/LiteralSupport.cpp
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaLookup.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=303813&r1=303812&r2=303813&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Wed May 24 17:18:35 2017
@@ -173,6 +173,8 @@ def warn_char_constant_too_large : Warni
 def err_multichar_utf_character_literal : Error<
   "Unicode character literals may not contain multiple characters">;
 def err_exponent_has_no_digits : Error<"exponent has no digits">;
+def ext_imaginary_constant : Extension<
+  "imaginary constants are a GNU extension">, InGroup<GNUImaginaryConstant>;
 def err_hex_constant_requires : Error<
   "hexadecimal floating %select{constant|literal}0 requires "
   "%select{an exponent|a significand}1">;

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=303813&r1=303812&r2=303813&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed May 24 17:18:35 2017
@@ -194,8 +194,6 @@ def warn_duplicate_declspec : Warning<"d
   InGroup<DuplicateDeclSpecifier>;
 def ext_plain_complex : ExtWarn<
   "plain '_Complex' requires a type specifier; assuming '_Complex double'">;
-def ext_imaginary_constant : Extension<
-  "imaginary constants are a GNU extension">, InGroup<GNUImaginaryConstant>;
 def ext_integer_complex : Extension<
   "complex integer types are a GNU extension">, InGroup<GNUComplexInteger>;
 

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=303813&r1=303812&r2=303813&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Wed May 24 17:18:35 2017
@@ -2946,8 +2946,6 @@ public:
   enum LiteralOperatorLookupResult {
     /// \brief The lookup resulted in an error.
     LOLR_Error,
-    /// \brief The lookup found no match but no diagnostic was issued.
-    LOLR_ErrorNoDiagnostic,
     /// \brief The lookup found a single 'cooked' literal operator, which
     /// expects a normal literal to be built and passed to it.
     LOLR_Cooked,
@@ -3072,8 +3070,7 @@ public:
                                                     ArrayRef<QualType> ArgTys,
                                                     bool AllowRaw,
                                                     bool AllowTemplate,
-                                                    bool AllowStringTemplate,
-                                                    bool DiagnoseMissing);
+                                                    bool AllowStringTemplate);
   bool isKnownName(StringRef name);
 
   void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc,

Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=303813&r1=303812&r2=303813&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
+++ cfe/trunk/lib/Lex/LiteralSupport.cpp Wed May 24 17:18:35 2017
@@ -651,6 +651,9 @@ NumericLiteralParser::NumericLiteralPars
           break;
         }
       }
+      // "i", "if", and "il" are user-defined suffixes in C++1y.
+      if (*s == 'i' && PP.getLangOpts().CPlusPlus14)
+        break;
       // fall through.
     case 'j':
     case 'J':
@@ -662,34 +665,35 @@ NumericLiteralParser::NumericLiteralPars
     break;
   }
 
-  // "i", "if", and "il" are user-defined suffixes in C++1y.
-  if (s != ThisTokEnd || isImaginary) {
+  if (s != ThisTokEnd) {
     // FIXME: Don't bother expanding UCNs if !tok.hasUCN().
     expandUCNs(UDSuffixBuf, StringRef(SuffixBegin, ThisTokEnd - SuffixBegin));
     if (isValidUDSuffix(PP.getLangOpts(), UDSuffixBuf)) {
-      if (!isImaginary) {
-        // Any suffix pieces we might have parsed are actually part of the
-        // ud-suffix.
-        isLong = false;
-        isUnsigned = false;
-        isLongLong = false;
-        isFloat = false;
-        isHalf = false;
-        isImaginary = false;
-        MicrosoftInteger = 0;
-      }
+      // Any suffix pieces we might have parsed are actually part of the
+      // ud-suffix.
+      isLong = false;
+      isUnsigned = false;
+      isLongLong = false;
+      isFloat = false;
+      isHalf = false;
+      isImaginary = false;
+      MicrosoftInteger = 0;
 
       saw_ud_suffix = true;
       return;
     }
 
-    if (s != ThisTokEnd) {
-      // Report an error if there are any.
-      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, SuffixBegin - ThisTokBegin),
-              diag::err_invalid_suffix_constant)
-          << StringRef(SuffixBegin, ThisTokEnd - SuffixBegin) << isFPConstant;
-      hadError = true;
-    }
+    // Report an error if there are any.
+    PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, SuffixBegin - ThisTokBegin),
+            diag::err_invalid_suffix_constant)
+      << StringRef(SuffixBegin, ThisTokEnd-SuffixBegin) << isFPConstant;
+    hadError = true;
+    return;
+  }
+
+  if (isImaginary) {
+    PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, SuffixBegin - ThisTokBegin),
+            diag::ext_imaginary_constant);
   }
 }
 

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=303813&r1=303812&r2=303813&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed May 24 17:18:35 2017
@@ -1609,9 +1609,8 @@ static ExprResult BuildCookedLiteralOper
 
   LookupResult R(S, OpName, UDSuffixLoc, Sema::LookupOrdinaryName);
   if (S.LookupLiteralOperator(Scope, R, llvm::makeArrayRef(ArgTy, Args.size()),
-                              /*AllowRaw*/ false, /*AllowTemplate*/ false,
-                              /*AllowStringTemplate*/ false,
-                              /*DiagnoseMissing*/ true) == Sema::LOLR_Error)
+                              /*AllowRaw*/false, /*AllowTemplate*/false,
+                              /*AllowStringTemplate*/false) == Sema::LOLR_Error)
     return ExprError();
 
   return S.BuildLiteralOperatorCall(R, OpNameInfo, Args, LitEndLoc);
@@ -1702,9 +1701,8 @@ Sema::ActOnStringLiteral(ArrayRef<Token>
 
   LookupResult R(*this, OpName, UDSuffixLoc, LookupOrdinaryName);
   switch (LookupLiteralOperator(UDLScope, R, ArgTy,
-                                /*AllowRaw*/ false, /*AllowTemplate*/ false,
-                                /*AllowStringTemplate*/ true,
-                                /*DiagnoseMissing*/ true)) {
+                                /*AllowRaw*/false, /*AllowTemplate*/false,
+                                /*AllowStringTemplate*/true)) {
 
   case LOLR_Cooked: {
     llvm::APInt Len(Context.getIntWidth(SizeType), Literal.GetNumStringChars());
@@ -1737,7 +1735,6 @@ Sema::ActOnStringLiteral(ArrayRef<Token>
   }
   case LOLR_Raw:
   case LOLR_Template:
-  case LOLR_ErrorNoDiagnostic:
     llvm_unreachable("unexpected literal operator lookup result");
   case LOLR_Error:
     return ExprError();
@@ -3360,15 +3357,11 @@ ExprResult Sema::ActOnNumericConstant(co
     // literal or a cooked one.
     LookupResult R(*this, OpName, UDSuffixLoc, LookupOrdinaryName);
     switch (LookupLiteralOperator(UDLScope, R, CookedTy,
-                                  /*AllowRaw*/ true, /*AllowTemplate*/ true,
-                                  /*AllowStringTemplate*/ false,
-                                  /*DiagnoseMissing*/ !Literal.isImaginary)) {
-    case LOLR_ErrorNoDiagnostic:
-      // Lookup failure for imaginary constants isn't fatal, there's still the
-      // GNU extension producing _Complex types.
-      break;
+                                  /*AllowRaw*/true, /*AllowTemplate*/true,
+                                  /*AllowStringTemplate*/false)) {
     case LOLR_Error:
       return ExprError();
+
     case LOLR_Cooked: {
       Expr *Lit;
       if (Literal.isFloatingLiteral()) {
@@ -3584,12 +3577,10 @@ ExprResult Sema::ActOnNumericConstant(co
   }
 
   // If this is an imaginary literal, create the ImaginaryLiteral wrapper.
-  if (Literal.isImaginary) {
+  if (Literal.isImaginary)
     Res = new (Context) ImaginaryLiteral(Res,
                                         Context.getComplexType(Res->getType()));
 
-    Diag(Tok.getLocation(), diag::ext_imaginary_constant);
-  }
   return Res;
 }
 

Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=303813&r1=303812&r2=303813&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed May 24 17:18:35 2017
@@ -3066,7 +3066,7 @@ Sema::LiteralOperatorLookupResult
 Sema::LookupLiteralOperator(Scope *S, LookupResult &R,
                             ArrayRef<QualType> ArgTys,
                             bool AllowRaw, bool AllowTemplate,
-                            bool AllowStringTemplate, bool DiagnoseMissing) {
+                            bool AllowStringTemplate) {
   LookupName(R, S);
   assert(R.getResultKind() != LookupResult::Ambiguous &&
          "literal operator lookup can't be ambiguous");
@@ -3167,15 +3167,11 @@ Sema::LookupLiteralOperator(Scope *S, Lo
     return LOLR_StringTemplate;
 
   // Didn't find anything we could use.
-  if (DiagnoseMissing) {
-    Diag(R.getNameLoc(), diag::err_ovl_no_viable_literal_operator)
-        << R.getLookupName() << (int)ArgTys.size() << ArgTys[0]
-        << (ArgTys.size() == 2 ? ArgTys[1] : QualType()) << AllowRaw
-        << (AllowTemplate || AllowStringTemplate);
-    return LOLR_Error;
-  }
-
-  return LOLR_ErrorNoDiagnostic;
+  Diag(R.getNameLoc(), diag::err_ovl_no_viable_literal_operator)
+    << R.getLookupName() << (int)ArgTys.size() << ArgTys[0]
+    << (ArgTys.size() == 2 ? ArgTys[1] : QualType()) << AllowRaw
+    << (AllowTemplate || AllowStringTemplate);
+  return LOLR_Error;
 }
 
 void ADLResult::insert(NamedDecl *New) {

Removed: cfe/trunk/test/SemaCXX/imaginary-constants.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/imaginary-constants.cpp?rev=303812&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/imaginary-constants.cpp (original)
+++ cfe/trunk/test/SemaCXX/imaginary-constants.cpp (removed)
@@ -1,44 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s -include %s -std=gnu++98
-// RUN: %clang_cc1 -fsyntax-only -verify %s -include %s -std=c++11
-// RUN: %clang_cc1 -fsyntax-only -verify %s -include %s -std=c++14 -DCXX14=1
-
-// expected-no-diagnostics
-
-#ifndef HEADER
-#define HEADER
-
-_Complex int val1 = 2i;
-_Complex long val2 = 2il;
-_Complex long long val3 = 2ill;
-_Complex float val4 = 2.0if;
-_Complex double val5 = 2.0i;
-_Complex long double val6 = 2.0il;
-
-#if CXX14
-
-#pragma clang system_header
-
-namespace std {
-  template<typename T> struct complex {};
-  complex<float> operator""if(unsigned long long);
-  complex<float> operator""if(long double);
-
-  complex<double> operator"" i(unsigned long long);
-  complex<double> operator"" i(long double);
-
-  complex<long double> operator"" il(unsigned long long);
-  complex<long double> operator"" il(long double);
-}
-
-using namespace std;
-
-complex<float> f1 = 2.0if;
-complex<float> f2 = 2if;
-complex<double> d1 = 2.0i;
-complex<double> d2 = 2i;
-complex<long double> l1 = 2.0il;
-complex<long double> l2 = 2il;
-
-#endif
-
-#endif




More information about the cfe-commits mailing list