[PATCH] D66481: [C++20] Support for lambdas in unevaluated context

2019-08-20 Thread Kris Jusiak via Phabricator via cfe-commits
krzysztof-jusiak added a comment.

In D66481#1637530 , @lebedev.ri wrote:

> Doesn't this inadvertently allow them in every standard? That seems wrong.


Good point, you are right, will fix it and resubmit 


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66481/new/

https://reviews.llvm.org/D66481



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D66481: [C++20] Support for lambdas in unevaluated context

2019-08-20 Thread Kris Jusiak via Phabricator via cfe-commits
krzysztof-jusiak added a comment.

In D66481#1637525 , @riccibruno wrote:

> Can you submit the patch with the full context (ie: git diff -U999) ?


Sure, will do it


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66481/new/

https://reviews.llvm.org/D66481



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D66481: [C++20] Support for lambdas in unevaluated context

2019-08-20 Thread Kris Jusiak via Phabricator via cfe-commits
krzysztof-jusiak created this revision.
krzysztof-jusiak added a reviewer: rsmith.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Problem:

- Lambdas in unevaluated context aren't supported in the newest clang yet but 
are required for our usage of jit.

Solution:

- Add support for lambdas in unevaluated context.


Repository:
  rC Clang

https://reviews.llvm.org/D66481

Files:
  clang/lib/Sema/SemaExpr.cpp
  clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp


Index: clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp
===
--- clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp
+++ clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp
@@ -15,9 +15,9 @@
 };
 
 void unevaluated_operand(P , int i) {
-  int i2 = sizeof([] ()->int { return 0; }()); // expected-error{{lambda 
expression in an unevaluated operand}}
+  int i2 = sizeof([] ()->int { return 0; }());
   const std::type_info  = typeid([&]() -> P& { return p; }());
-  const std::type_info  = typeid([&]() -> int { return i; }());  // 
expected-error{{lambda expression in an unevaluated operand}}
+  const std::type_info  = typeid([&]() -> int { return i; }());
 }
 
 template
@@ -37,7 +37,7 @@
   // because the copy-initialization of the capture of boom_float occurs in an
   // unevaluated operand.
   const std::type_info 
-= typeid([=]() -> int { boom_float.tickle(); return 0; }()); // 
expected-error{{lambda expression in an unevaluated operand}}
+= typeid([=]() -> int { boom_float.tickle(); return 0; }());
 
   auto foo = [=]() -> int { boom_double.tickle(); return 0; }; // 
expected-note{{in instantiation of member function 'Boom::Boom' 
requested here}}
 }
Index: clang/lib/Sema/SemaExpr.cpp
===
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -14577,18 +14577,7 @@
 if (Rec.ExprContext == ExpressionKind::EK_TemplateArgument || 
Rec.isUnevaluated() ||
 (Rec.isConstantEvaluated() && !getLangOpts().CPlusPlus17)) {
   unsigned D;
-  if (Rec.isUnevaluated()) {
-// C++11 [expr.prim.lambda]p2:
-//   A lambda-expression shall not appear in an unevaluated operand
-//   (Clause 5).
-D = diag::err_lambda_unevaluated_operand;
-  } else if (Rec.isConstantEvaluated() && !getLangOpts().CPlusPlus17) {
-// C++1y [expr.const]p2:
-//   A conditional-expression e is a core constant expression unless 
the
-//   evaluation of e, following the rules of the abstract machine, 
would
-//   evaluate [...] a lambda-expression.
-D = diag::err_lambda_in_constant_expression;
-  } else if (Rec.ExprContext == ExpressionKind::EK_TemplateArgument) {
+if (Rec.ExprContext == ExpressionKind::EK_TemplateArgument) {
 // C++17 [expr.prim.lamda]p2:
 // A lambda-expression shall not appear [...] in a template-argument.
 D = diag::err_lambda_in_invalid_context;


Index: clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp
===
--- clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp
+++ clang/test/CXX/expr/expr.prim/expr.prim.lambda/p2.cpp
@@ -15,9 +15,9 @@
 };
 
 void unevaluated_operand(P , int i) {
-  int i2 = sizeof([] ()->int { return 0; }()); // expected-error{{lambda expression in an unevaluated operand}}
+  int i2 = sizeof([] ()->int { return 0; }());
   const std::type_info  = typeid([&]() -> P& { return p; }());
-  const std::type_info  = typeid([&]() -> int { return i; }());  // expected-error{{lambda expression in an unevaluated operand}}
+  const std::type_info  = typeid([&]() -> int { return i; }());
 }
 
 template
@@ -37,7 +37,7 @@
   // because the copy-initialization of the capture of boom_float occurs in an
   // unevaluated operand.
   const std::type_info 
-= typeid([=]() -> int { boom_float.tickle(); return 0; }()); // expected-error{{lambda expression in an unevaluated operand}}
+= typeid([=]() -> int { boom_float.tickle(); return 0; }());
 
   auto foo = [=]() -> int { boom_double.tickle(); return 0; }; // expected-note{{in instantiation of member function 'Boom::Boom' requested here}}
 }
Index: clang/lib/Sema/SemaExpr.cpp
===
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -14577,18 +14577,7 @@
 if (Rec.ExprContext == ExpressionKind::EK_TemplateArgument || Rec.isUnevaluated() ||
 (Rec.isConstantEvaluated() && !getLangOpts().CPlusPlus17)) {
   unsigned D;
-  if (Rec.isUnevaluated()) {
-// C++11 [expr.prim.lambda]p2:
-//   A lambda-expression shall not appear in an unevaluated operand
-//   (Clause 5).
-D = diag::err_lambda_unevaluated_operand;
-  } else if (Rec.isConstantEvaluated() && !getLangOpts().CPlusPlus17) {
-// C++1y [expr.const]p2:
-