]> granicus.if.org Git - clang/commitdiff
DR974: Lambdas can have default arguments.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 17 Apr 2013 16:25:20 +0000 (16:25 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 17 Apr 2013 16:25:20 +0000 (16:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179688 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp
test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp

index a7ef2185df2ceb97cfba01def6baa91cdfa86e52..7e0438a2847d399381b7717e300b5a22d51dc1f6 100644 (file)
@@ -254,7 +254,6 @@ def : DiagGroup<"strict-overflow=5">;
 def : DiagGroup<"strict-overflow">;
 
 def InvalidOffsetof : DiagGroup<"invalid-offsetof">;
-def LambdaExtensions : DiagGroup<"lambda-extensions">;
 def : DiagGroup<"strict-prototypes">;
 def StrictSelector : DiagGroup<"strict-selector-match">;
 def MethodDuplicate : DiagGroup<"duplicate-method-match">;
index 1330ad68b6d1b25a5866123544d77b62c7738f34..e6e67b454b0cd2eaf6abb9ef315fd5e9e4629454 100644 (file)
@@ -4789,9 +4789,6 @@ let CategoryName = "Lambda Issue" in {
     "incomplete result type %0 in lambda expression">;
   def err_lambda_objc_object_result : Error<
     "non-pointer Objective-C class type %0 in lambda expression result">;
-  def ext_lambda_default_arguments : ExtWarn<
-    "C++11 forbids default arguments for lambda expressions">,
-    InGroup<LambdaExtensions>;
   def err_noreturn_lambda_has_return_expr : Error<
     "lambda declared 'noreturn' should not return">;
   def warn_maybe_falloff_nonvoid_lambda : Warning<
index a318f64765f4456ab9d63be788812c7dc0833b6a..d2051b52e83efc5ce1715a0131c8cac49fe8c07d 100644 (file)
@@ -636,22 +636,12 @@ void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) {
   bool IsLambda = FD->getOverloadedOperator() == OO_Call &&
                   isa<CXXMethodDecl>(FD) &&
                   cast<CXXMethodDecl>(FD)->getParent()->isLambda();
-              
+
   // Find first parameter with a default argument
   for (p = 0; p < NumParams; ++p) {
     ParmVarDecl *Param = FD->getParamDecl(p);
-    if (Param->hasDefaultArg()) {
-      // C++11 [expr.prim.lambda]p5:
-      //   [...] Default arguments (8.3.6) shall not be specified in the 
-      //   parameter-declaration-clause of a lambda-declarator.
-      //
-      // FIXME: Core issue 974 strikes this sentence, we only provide an
-      // extension warning.
-      if (IsLambda)
-        Diag(Param->getLocation(), diag::ext_lambda_default_arguments)
-          << Param->getDefaultArgRange();
+    if (Param->hasDefaultArg())
       break;
-    }
   }
 
   // C++ [dcl.fct.default]p4:
index 5dac886d4d1ddab5ca396c201921cff657001717..38d5d0a6cd6aa85d5bd41d95c48cadf5e4e23566 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -Wno-lambda-extensions -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
 
 void defargs() {
   auto l1 = [](int i, int j = 17, int k = 18) { return i + j + k; };
index 9dffc1ff26406fa1d823723a493befa2f4ad3473..dc2c209af268a3422db50f7ce000203fe4c48fd6 100644 (file)
@@ -39,12 +39,10 @@ void test_quals() {
   bogus_override_if_virtual<decltype(l)> bogus;
 }
 
-// Default arguments (8.3.6) shall not be specified in the
-// parameter-declaration-clause of a lambda- declarator.
-// Note: Removed by core issue 974.
+// Core issue 974: default arguments (8.3.6) may be specified in the
+// parameter-declaration-clause of a lambda-declarator.
 int test_default_args() {
-  return [](int i = 5,  // expected-warning{{C++11 forbids default arguments for lambda expressions}}
-            int j = 17) { return i+j;}(5, 6);
+  return [](int i = 5, int j = 17) { return i+j;}(5, 6);
 }
 
 // Any exception-specification specified on a lambda-expression