[llvm-branch-commits] [cfe-branch] r278771 - [Branch 3.9] Remove any traces of partial constexpr lambda implementation

Faisal Vali via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Aug 15 19:11:53 PDT 2016


Author: faisalv
Date: Mon Aug 15 21:11:53 2016
New Revision: 278771

URL: http://llvm.org/viewvc/llvm-project?rev=278771&view=rev
Log:
[Branch 3.9] Remove any traces of partial constexpr lambda implementation 

This patch essentially reverses all the changes from the following commit: https://reviews.llvm.org/rL264513 for branch 3.9.

Requested by Richard and Approved by Hans here: https://reviews.llvm.org/D23485



Removed:
    cfe/branches/release_39/test/Parser/cxx1z-constexpr-lambdas.cpp
    cfe/branches/release_39/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
Modified:
    cfe/branches/release_39/include/clang/Basic/DiagnosticASTKinds.td
    cfe/branches/release_39/include/clang/Basic/DiagnosticParseKinds.td
    cfe/branches/release_39/include/clang/Sema/Sema.h
    cfe/branches/release_39/lib/AST/ExprConstant.cpp
    cfe/branches/release_39/lib/Parse/ParseExprCXX.cpp
    cfe/branches/release_39/lib/Sema/SemaLambda.cpp
    cfe/branches/release_39/lib/Sema/TreeTransform.h

Modified: cfe/branches/release_39/include/clang/Basic/DiagnosticASTKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/include/clang/Basic/DiagnosticASTKinds.td?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/include/clang/Basic/DiagnosticASTKinds.td (original)
+++ cfe/branches/release_39/include/clang/Basic/DiagnosticASTKinds.td Mon Aug 15 21:11:53 2016
@@ -158,12 +158,6 @@ def warn_integer_constant_overflow : War
   "overflow in expression; result is %0 with type %1">,
   InGroup<DiagGroup<"integer-overflow">>;
 
-// This is a temporary diagnostic, and shall be removed once our 
-// implementation is complete, and like the preceding constexpr notes belongs
-// in Sema.
-def note_unimplemented_constexpr_lambda_feature_ast : Note<
-    "unimplemented constexpr lambda feature: %0 (coming soon!)">;
-
 // inline asm related.
 let CategoryName = "Inline Assembly Issue" in {
   def err_asm_invalid_escape : Error<

Modified: cfe/branches/release_39/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/include/clang/Basic/DiagnosticParseKinds.td?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/branches/release_39/include/clang/Basic/DiagnosticParseKinds.td Mon Aug 15 21:11:53 2016
@@ -780,20 +780,11 @@ def warn_cxx98_compat_lambda : Warning<
   InGroup<CXX98Compat>, DefaultIgnore;
 def err_lambda_missing_parens : Error<
   "lambda requires '()' before %select{'mutable'|return type|"
-  "attribute specifier|'constexpr'}0">;
-def err_lambda_decl_specifier_repeated : Error<
-  "%select{'mutable'|'constexpr'}0 cannot appear multiple times in a lambda declarator">;
+  "attribute specifier}0">;
 // C++1z lambda expressions
 def err_expected_star_this_capture : Error<
   "expected 'this' following '*' in lambda capture list">;
 
-// C++1z constexpr lambda expressions
-def warn_cxx14_compat_constexpr_on_lambda : Warning<
-  "constexpr on lambda expressions is incompatible with C++ standards before C++1z">,
-  InGroup<CXXPre1zCompat>, DefaultIgnore;
-def ext_constexpr_on_lambda_cxx1z : ExtWarn<
-  "'constexpr' on lambda expressions is a C++1z extension">, InGroup<CXX1z>;
-
 // Availability attribute
 def err_expected_version : Error<
   "expected a version of the form 'major[.minor[.subminor]]'">;

Modified: cfe/branches/release_39/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/include/clang/Sema/Sema.h?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/include/clang/Sema/Sema.h (original)
+++ cfe/branches/release_39/include/clang/Sema/Sema.h Mon Aug 15 21:11:53 2016
@@ -5111,8 +5111,7 @@ public:
                                        SourceRange IntroducerRange,
                                        TypeSourceInfo *MethodType,
                                        SourceLocation EndLoc,
-                                       ArrayRef<ParmVarDecl *> Params, 
-                                       bool IsConstexprSpecified);
+                                       ArrayRef<ParmVarDecl *> Params);
 
   /// \brief Endow the lambda scope info with the relevant properties.
   void buildLambdaScope(sema::LambdaScopeInfo *LSI, 

Modified: cfe/branches/release_39/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/AST/ExprConstant.cpp?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/lib/AST/ExprConstant.cpp (original)
+++ cfe/branches/release_39/lib/AST/ExprConstant.cpp Mon Aug 15 21:11:53 2016
@@ -36,7 +36,6 @@
 #include "clang/AST/APValue.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ASTDiagnostic.h"
-#include "clang/AST/ASTLambda.h"
 #include "clang/AST/CharUnits.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/RecordLayout.h"
@@ -2126,22 +2125,7 @@ static bool evaluateVarDeclInit(EvalInfo
   // If this is a local variable, dig out its value.
   if (Frame) {
     Result = Frame->getTemporary(VD);
-    if (!Result) {
-      // Assume variables referenced within a lambda's call operator that were
-      // not declared within the call operator are captures and during checking
-      // of a potential constant expression, assume they are unknown constant
-      // expressions.
-      assert(isLambdaCallOperator(Frame->Callee) &&
-             (VD->getDeclContext() != Frame->Callee || VD->isInitCapture()) &&
-             "missing value for local variable");
-      if (Info.checkingPotentialConstantExpression())
-        return false;
-      // FIXME: implement capture evaluation during constant expr evaluation.
-      Info.FFDiag(E->getLocStart(),
-           diag::note_unimplemented_constexpr_lambda_feature_ast)
-          << "captures not currently allowed";
-      return false;
-    }
+    assert(Result && "missing value for local variable");
     return true;
   }
 

Modified: cfe/branches/release_39/lib/Parse/ParseExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/Parse/ParseExprCXX.cpp?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/lib/Parse/ParseExprCXX.cpp (original)
+++ cfe/branches/release_39/lib/Parse/ParseExprCXX.cpp Mon Aug 15 21:11:53 2016
@@ -1053,58 +1053,6 @@ bool Parser::TryParseLambdaIntroducer(La
   return false;
 }
 
-static void
-tryConsumeMutableOrConstexprToken(Parser &P, SourceLocation &MutableLoc,
-                                  SourceLocation &ConstexprLoc,
-                                  SourceLocation &DeclEndLoc) {
-  assert(MutableLoc.isInvalid());
-  assert(ConstexprLoc.isInvalid());
-  // Consume constexpr-opt mutable-opt in any sequence, and set the DeclEndLoc
-  // to the final of those locations. Emit an error if we have multiple
-  // copies of those keywords and recover.
-
-  while (true) {
-    switch (P.getCurToken().getKind()) {
-    case tok::kw_mutable: {
-      if (MutableLoc.isValid()) {
-        P.Diag(P.getCurToken().getLocation(),
-               diag::err_lambda_decl_specifier_repeated)
-            << 0 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
-      }
-      MutableLoc = P.ConsumeToken();
-      DeclEndLoc = MutableLoc;
-      break /*switch*/;
-    }
-    case tok::kw_constexpr:
-      if (ConstexprLoc.isValid()) {
-        P.Diag(P.getCurToken().getLocation(),
-               diag::err_lambda_decl_specifier_repeated)
-            << 1 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
-      }
-      ConstexprLoc = P.ConsumeToken();
-      DeclEndLoc = ConstexprLoc;
-      break /*switch*/;
-    default:
-      return;
-    }
-  }
-}
-
-static void
-addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc,
-                                  DeclSpec &DS) {
-  if (ConstexprLoc.isValid()) {
-    P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus1z
-                             ? diag::ext_constexpr_on_lambda_cxx1z
-                             : diag::warn_cxx14_compat_constexpr_on_lambda);
-    const char *PrevSpec = nullptr;
-    unsigned DiagID = 0;
-    DS.SetConstexprSpec(ConstexprLoc, PrevSpec, DiagID);
-    assert(PrevSpec == nullptr && DiagID == 0 &&
-           "Constexpr cannot have been set previously!");
-  }
-}
-
 /// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda
 /// expression.
 ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
@@ -1163,13 +1111,10 @@ ExprResult Parser::ParseLambdaExpression
     // compatible with MSVC.
     MaybeParseMicrosoftDeclSpecs(Attr, &DeclEndLoc);
 
-    // Parse mutable-opt and/or constexpr-opt, and update the DeclEndLoc.
+    // Parse 'mutable'[opt].
     SourceLocation MutableLoc;
-    SourceLocation ConstexprLoc;
-    tryConsumeMutableOrConstexprToken(*this, MutableLoc, ConstexprLoc,
-                                      DeclEndLoc);
-    
-    addConstexprToLambdaDeclSpecifier(*this, ConstexprLoc, DS);
+    if (TryConsumeToken(tok::kw_mutable, MutableLoc))
+      DeclEndLoc = MutableLoc;
 
     // Parse exception-specification[opt].
     ExceptionSpecificationType ESpecType = EST_None;
@@ -1227,8 +1172,7 @@ ExprResult Parser::ParseLambdaExpression
                                            LParenLoc, FunLocalRangeEnd, D,
                                            TrailingReturnType),
                   Attr, DeclEndLoc);
-  } else if (Tok.isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute,
-                         tok::kw_constexpr) ||
+  } else if (Tok.isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute) ||
              (Tok.is(tok::l_square) && NextToken().is(tok::l_square))) {
     // It's common to forget that one needs '()' before 'mutable', an attribute
     // specifier, or the result type. Deal with this.
@@ -1238,7 +1182,6 @@ ExprResult Parser::ParseLambdaExpression
     case tok::arrow: TokKind = 1; break;
     case tok::kw___attribute:
     case tok::l_square: TokKind = 2; break;
-    case tok::kw_constexpr: TokKind = 3; break;
     default: llvm_unreachable("Unknown token kind");
     }
 

Modified: cfe/branches/release_39/lib/Sema/SemaLambda.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/Sema/SemaLambda.cpp?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/lib/Sema/SemaLambda.cpp (original)
+++ cfe/branches/release_39/lib/Sema/SemaLambda.cpp Mon Aug 15 21:11:53 2016
@@ -355,8 +355,7 @@ CXXMethodDecl *Sema::startLambdaDefiniti
                                            SourceRange IntroducerRange,
                                            TypeSourceInfo *MethodTypeInfo,
                                            SourceLocation EndLoc,
-                                           ArrayRef<ParmVarDecl *> Params,
-                                           const bool IsConstexprSpecified) {
+                                           ArrayRef<ParmVarDecl *> Params) {
   QualType MethodType = MethodTypeInfo->getType();
   TemplateParameterList *TemplateParams = 
             getGenericLambdaTemplateParameterList(getCurLambda(), *this);
@@ -393,7 +392,7 @@ CXXMethodDecl *Sema::startLambdaDefiniti
                             MethodType, MethodTypeInfo,
                             SC_None,
                             /*isInline=*/true,
-                            IsConstexprSpecified,
+                            /*isConstExpr=*/false,
                             EndLoc);
   Method->setAccess(AS_public);
   
@@ -878,9 +877,8 @@ void Sema::ActOnStartOfLambdaDefinition(
   CXXRecordDecl *Class = createLambdaClosureType(Intro.Range, MethodTyInfo,
                                                  KnownDependent, Intro.Default);
 
-  CXXMethodDecl *Method =
-      startLambdaDefinition(Class, Intro.Range, MethodTyInfo, EndLoc, Params,
-                            ParamInfo.getDeclSpec().isConstexprSpecified());
+  CXXMethodDecl *Method = startLambdaDefinition(Class, Intro.Range,
+                                                MethodTyInfo, EndLoc, Params);
   if (ExplicitParams)
     CheckCXXDefaultArguments(Method);
   
@@ -1599,17 +1597,6 @@ ExprResult Sema::BuildLambdaExpr(SourceL
                                           CaptureInits, ArrayIndexVars, 
                                           ArrayIndexStarts, EndLoc,
                                           ContainsUnexpandedParameterPack);
-  // If the lambda expression's call operator is not explicitly marked constexpr
-  // and we are not in a dependent context, analyze the call operator to infer
-  // its constexpr-ness, supressing diagnostics while doing so.
-  if (getLangOpts().CPlusPlus1z && !CallOperator->isInvalidDecl() &&
-      !CallOperator->isConstexpr() &&
-      !Class->getDeclContext()->isDependentContext()) {
-    TentativeAnalysisScope DiagnosticScopeGuard(*this);
-    CallOperator->setConstexpr(
-        CheckConstexprFunctionDecl(CallOperator) &&
-        CheckConstexprFunctionBody(CallOperator, CallOperator->getBody()));
-  }
 
   if (!CurContext->isDependentContext()) {
     switch (ExprEvalContexts.back().Context) {

Modified: cfe/branches/release_39/lib/Sema/TreeTransform.h
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/Sema/TreeTransform.h?rev=278771&r1=278770&r2=278771&view=diff
==============================================================================
--- cfe/branches/release_39/lib/Sema/TreeTransform.h (original)
+++ cfe/branches/release_39/lib/Sema/TreeTransform.h Mon Aug 15 21:11:53 2016
@@ -10222,9 +10222,7 @@ TreeTransform<Derived>::TransformLambdaE
   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
       Class, E->getIntroducerRange(), NewCallOpTSI,
       E->getCallOperator()->getLocEnd(),
-      NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
-      E->getCallOperator()->isConstexpr());
-
+      NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams());
   LSI->CallOperator = NewCallOperator;
 
   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);

Removed: cfe/branches/release_39/test/Parser/cxx1z-constexpr-lambdas.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/test/Parser/cxx1z-constexpr-lambdas.cpp?rev=278770&view=auto
==============================================================================
--- cfe/branches/release_39/test/Parser/cxx1z-constexpr-lambdas.cpp (original)
+++ cfe/branches/release_39/test/Parser/cxx1z-constexpr-lambdas.cpp (removed)
@@ -1,31 +0,0 @@
-// RUN: %clang_cc1 -std=c++1z %s -verify 
-// RUN: %clang_cc1 -std=c++14 %s -verify 
-// RUN: %clang_cc1 -std=c++11 %s -verify 
-
-
-auto XL0 = [] constexpr { }; //expected-error{{requires '()'}} expected-error{{expected body}}
-auto XL1 = [] () mutable 
-                 mutable     //expected-error{{cannot appear multiple times}}
-                 mutable { }; //expected-error{{cannot appear multiple times}}
-
-#if __cplusplus > 201402L
-auto XL2 = [] () constexpr mutable constexpr { }; //expected-error{{cannot appear multiple times}}
-auto L = []() mutable constexpr { };
-auto L2 = []() constexpr { };
-auto L4 = []() constexpr mutable { }; 
-auto XL16 = [] () constexpr
-                  mutable
-                  constexpr   //expected-error{{cannot appear multiple times}}
-                  mutable     //expected-error{{cannot appear multiple times}}
-                  mutable     //expected-error{{cannot appear multiple times}}
-                  constexpr   //expected-error{{cannot appear multiple times}}
-                  constexpr   //expected-error{{cannot appear multiple times}}
-                  { };
-
-#else
-auto L = []() mutable constexpr {return 0; }; //expected-warning{{is a C++1z extension}}
-auto L2 = []() constexpr { return 0;};//expected-warning{{is a C++1z extension}}
-auto L4 = []() constexpr mutable { return 0; }; //expected-warning{{is a C++1z extension}}
-#endif
-
-

Removed: cfe/branches/release_39/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/test/SemaCXX/cxx1z-constexpr-lambdas.cpp?rev=278770&view=auto
==============================================================================
--- cfe/branches/release_39/test/SemaCXX/cxx1z-constexpr-lambdas.cpp (original)
+++ cfe/branches/release_39/test/SemaCXX/cxx1z-constexpr-lambdas.cpp (removed)
@@ -1,36 +0,0 @@
-// RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks %s
-// RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s 
-// RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks -fms-extensions %s 
-// RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s 
-
-namespace test_constexpr_checking {
-
-namespace ns1 {
-  struct NonLit { ~NonLit(); };  //expected-note{{not literal}}
-  auto L = [](NonLit NL) constexpr { }; //expected-error{{not a literal type}}
-} // end ns1
-
-namespace ns2 {
-  auto L = [](int I) constexpr { asm("non-constexpr");  }; //expected-error{{not allowed in constexpr function}}
-} // end ns1
-
-} // end ns test_constexpr_checking
-
-namespace test_constexpr_call {
-
-namespace ns1 {
-  auto L = [](int I) { return I; };
-  static_assert(L(3) == 3);
-} // end ns1
-namespace ns2 {
-  auto L = [](auto a) { return a; };
-  static_assert(L(3) == 3);
-  static_assert(L(3.14) == 3.14);
-}
-namespace ns3 {
-  auto L = [](auto a) { asm("non-constexpr"); return a; }; //expected-note{{declared here}}
-  constexpr int I =  //expected-error{{must be initialized by a constant expression}}
-      L(3); //expected-note{{non-constexpr function}}
-} 
-
-} // end ns test_constexpr_call
\ No newline at end of file




More information about the llvm-branch-commits mailing list