[PR c++/84492] stmt expr ending with overload
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 6 Mar 2018 06:24:40 +0000 (06:24 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 6 Mar 2018 06:24:40 +0000 (06:24 +0000)
We ICEd when returning a stmt expr that ends with an overloaded
function, because instantiate_type did not know what to do with
STMT_EXPRs.  And it shouldn't have to: the expected type of a stmt
expr cannot be used to resolve its value: an unresolved overload
cannot supply the result of a stmt expr.  Catch that and report the
error in the stmt expr before we have a chance to instantiate it.

for  gcc/cp/ChangeLog

PR c++/84492
* semantics.c (finish_stmt_expr_expr): Reject unresolved
overloads used as stmt expr values.

for  gcc/testsuite/ChangeLog

PR c++/84492
* g++.dg/pr84492.C: New.

From-SVN: r258269

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr84492.C [new file with mode: 0644]

index 3523b7e09125da38f37f34f40320f63951380bc6..cbacda6e3824c1eb204f1c7d4cd143d8a99b9762 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-06  Alexandre Oliva <aoliva@redhat.com>
+
+       PR c++/84492
+       * semantics.c (finish_stmt_expr_expr): Reject unresolved
+       overloads used as stmt expr values.
+
 2018-03-05  Jason Merrill  <jason@redhat.com>
 
        PR c++/84708 - ICE with lambda in local class NSDMI.
index bf5b41e08798268bde426d5cdfc21a63ce98fd73..8a0096ddf923fd5e951de86f2e84de4c71f23e8b 100644 (file)
@@ -2114,7 +2114,14 @@ finish_stmt_expr_expr (tree expr, tree stmt_expr)
     {
       tree type = TREE_TYPE (expr);
 
-      if (processing_template_decl)
+      if (type && type_unknown_p (type))
+       {
+         error ("a statement expression is an insufficient context"
+                " for overload resolution");
+         TREE_TYPE (stmt_expr) = error_mark_node;
+         return error_mark_node;
+       }
+      else if (processing_template_decl)
        {
          expr = build_stmt (input_location, EXPR_STMT, expr);
          expr = add_stmt (expr);
index a9f66a320a681de950344dbeba5bbd9df9c19d55..e3e3262ddf2a1b118c897b5f0f756c8821fec91f 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-06  Alexandre Oliva <aoliva@redhat.com>
+
+       PR c++/84492
+       * g++.dg/pr84492.C: New.
+
 2018-03-05  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/spec-barr-1.c: Change called function name to
diff --git a/gcc/testsuite/g++.dg/pr84492.C b/gcc/testsuite/g++.dg/pr84492.C
new file mode 100644 (file)
index 0000000..1a29220
--- /dev/null
@@ -0,0 +1,40 @@
+// { dg-do compile }
+// { dg-options "-fpermissive" }
+
+template<int> int foo()
+{
+  return ({ foo; }); // { dg-error "insufficient context" }
+}
+
+int bar()
+{
+  return ({ foo; }); // { dg-error "insufficient context" }
+}
+
+void bar(int);
+
+typedef void (*bart)(int);
+
+bart barf()
+{
+  return ({ bar; }); // { dg-error "insufficient context" }
+}
+
+bool bark()
+{
+  return ({ barf; }); // ok, no overload
+}
+
+template <typename T>
+class C
+{
+  static int f();
+  bool g()
+  {
+    return ({ f; }); // ok, no overload
+  }
+  bool g(int)
+  {
+    return ({ g; }); // { dg-error "insufficient context" }
+  }
+};