Rakete1111 created this revision.

`decltype(auto) lambda = []{};` is currently allowed by clang, gcc and MSVC, 
but it is actually not valid, because `decltype([]{})` (which is how the type 
of `lambda` is deduced) is ill-formed, I think. I honestly could argue both 
ways (and I did once), but the fact that `decltype(auto) list = {0,1};` is 
already rejected by all three, it seems like the most sensible way is to 
disallow it for lambdas too.


https://reviews.llvm.org/D37667

Files:
  include/clang/Basic/DiagnosticSemaKinds.td
  lib/Sema/SemaTemplateDeduction.cpp
  test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp


Index: test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp
===================================================================
--- test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp
+++ test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp
@@ -96,3 +96,10 @@
 
 auto init_list_1() { return { 1, 2, 3 }; } // expected-error {{cannot deduce 
return type from initializer list}}
 decltype(auto) init_list_2() { return { 1, 2, 3 }; } // expected-error 
{{cannot deduce return type from initializer list}}
+
+auto auto_lambda() { return []{}; }
+decltype(auto) decltype_lambda() { return []{}; } // expected-error {{cannot 
deduce 'decltype(auto)' from lambda}}
+
+auto AutoLambda = []{};
+decltype(auto) DecltypeLambda = []{}; // expected-error {{cannot deduce 
'decltype(auto)' from lambda}}
+
Index: lib/Sema/SemaTemplateDeduction.cpp
===================================================================
--- lib/Sema/SemaTemplateDeduction.cpp
+++ lib/Sema/SemaTemplateDeduction.cpp
@@ -4314,6 +4314,9 @@
       if (isa<InitListExpr>(Init)) {
         Diag(Init->getLocStart(), diag::err_decltype_auto_initializer_list);
         return DAR_FailedAlreadyDiagnosed;
+      } else if (isa<LambdaExpr>(Init)) {
+        Diag(Init->getLocStart(), diag::err_decltype_auto_lambda);
+        return DAR_FailedAlreadyDiagnosed;
       }
 
       QualType Deduced = BuildDecltypeType(Init, Init->getLocStart(), false);
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -2021,6 +2021,8 @@
   "cannot form %select{pointer to|reference to|array of}0 'decltype(auto)'">;
 def err_decltype_auto_initializer_list : Error<
   "cannot deduce 'decltype(auto)' from initializer list">;
+def err_decltype_auto_lambda : Error<
+  "cannot deduce 'decltype(auto)' from lambda">;
 
 // C++17 deduced class template specialization types
 def err_deduced_class_template_compound_type : Error<


Index: test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp
===================================================================
--- test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp
+++ test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-1y.cpp
@@ -96,3 +96,10 @@
 
 auto init_list_1() { return { 1, 2, 3 }; } // expected-error {{cannot deduce return type from initializer list}}
 decltype(auto) init_list_2() { return { 1, 2, 3 }; } // expected-error {{cannot deduce return type from initializer list}}
+
+auto auto_lambda() { return []{}; }
+decltype(auto) decltype_lambda() { return []{}; } // expected-error {{cannot deduce 'decltype(auto)' from lambda}}
+
+auto AutoLambda = []{};
+decltype(auto) DecltypeLambda = []{}; // expected-error {{cannot deduce 'decltype(auto)' from lambda}}
+
Index: lib/Sema/SemaTemplateDeduction.cpp
===================================================================
--- lib/Sema/SemaTemplateDeduction.cpp
+++ lib/Sema/SemaTemplateDeduction.cpp
@@ -4314,6 +4314,9 @@
       if (isa<InitListExpr>(Init)) {
         Diag(Init->getLocStart(), diag::err_decltype_auto_initializer_list);
         return DAR_FailedAlreadyDiagnosed;
+      } else if (isa<LambdaExpr>(Init)) {
+        Diag(Init->getLocStart(), diag::err_decltype_auto_lambda);
+        return DAR_FailedAlreadyDiagnosed;
       }
 
       QualType Deduced = BuildDecltypeType(Init, Init->getLocStart(), false);
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -2021,6 +2021,8 @@
   "cannot form %select{pointer to|reference to|array of}0 'decltype(auto)'">;
 def err_decltype_auto_initializer_list : Error<
   "cannot deduce 'decltype(auto)' from initializer list">;
+def err_decltype_auto_lambda : Error<
+  "cannot deduce 'decltype(auto)' from lambda">;
 
 // C++17 deduced class template specialization types
 def err_deduced_class_template_compound_type : Error<
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D37667: [... Blitz Rakete via Phabricator via cfe-commits

Reply via email to