PR c++/78337 - ICE on invalid with generic lambda
authorJason Merrill <jason@redhat.com>
Wed, 11 Jan 2017 21:43:42 +0000 (16:43 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 11 Jan 2017 21:43:42 +0000 (16:43 -0500)
* semantics.c (process_outer_var_ref): Check if containing_function
is null.  Move inform call under complain test.

From-SVN: r244340

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C [new file with mode: 0644]

index b318ab9839aa9ff551c01ac2502014e6e2305d82..201d73697e5309fe59a488bd9e5958493cfaeb0e 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-11  Jason Merrill  <jason@redhat.com>
+
+       PR c++/78337 - ICE on invalid with generic lambda
+       * semantics.c (process_outer_var_ref): Check if containing_function
+       is null.  Move inform call under complain test.
+
 2017-01-11  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/77812
index 342b671814cbf1193bce23cd251934f949fd3d5b..42024755e4f0808a780f486fe8c26ac200d2e3ab 100644 (file)
@@ -3278,6 +3278,8 @@ process_outer_var_ref (tree decl, tsubst_flags_t complain)
        2. a non-lambda function, or
        3. a non-default capturing lambda function.  */
     while (context != containing_function
+          /* containing_function can be null with invalid generic lambdas.  */
+          && containing_function
           && LAMBDA_FUNCTION_P (containing_function))
       {
        tree closure = DECL_CONTEXT (containing_function);
@@ -3365,10 +3367,13 @@ process_outer_var_ref (tree decl, tsubst_flags_t complain)
   else
     {
       if (complain & tf_error)
-       error (VAR_P (decl)
-              ? G_("use of local variable with automatic storage from containing function")
-              : G_("use of parameter from containing function"));
-      inform (DECL_SOURCE_LOCATION (decl), "%q#D declared here", decl);
+       {
+         error (VAR_P (decl)
+                ? G_("use of local variable with automatic storage from "
+                     "containing function")
+                : G_("use of parameter from containing function"));
+         inform (DECL_SOURCE_LOCATION (decl), "%q#D declared here", decl);
+       }
       return error_mark_node;
     }
   return decl;
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C
new file mode 100644 (file)
index 0000000..473e412
--- /dev/null
@@ -0,0 +1,27 @@
+// PR c++/78337
+// { dg-do compile { target c++14 } }
+
+struct X {
+  static constexpr int foo (int b) {
+    return b;
+  }
+};
+
+template<int>
+using Void = void;
+
+template<typename F,typename A>
+auto
+bar(F f, A a) -> decltype( ( f(a) , 0 ) ) // { dg-error "no match" }
+{ return {}; }
+
+
+int main() {
+  //constexpr
+  int f = 3;
+  (void)f;
+  auto l = [](auto of_type_X)->
+    Void<(decltype(of_type_X)::foo(f), 0)> // { dg-error "variable" }
+    {return;};
+  bar(l , X{});                        // { dg-error "no match" }
+}