re PR c++/71440 (ICE on invalid C++ code in instantiate_type, at cp/class.c:8247)
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 3 Aug 2017 09:26:17 +0000 (09:26 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 3 Aug 2017 09:26:17 +0000 (09:26 +0000)
/cp
2017-08-03  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/71440
* typeck.c (build_x_unary_op): Avoid pretty-printing constructor /
destructor as expressions.

/testsuite
2017-08-03  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/71440
* g++.dg/template/crash127.C: New.

From-SVN: r250848

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/crash127.C [new file with mode: 0644]

index 8be42940bd8d998b989e61a857b385542ef45a56..041c6c44bbecf0aeb47efb4629d1eeea490d649c 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/71440
+       * typeck.c (build_x_unary_op): Avoid pretty-printing constructor /
+       destructor as expressions.
+
 2017-08-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/81640
index 3dc64045e1a7b44f73f3de8277f25ee67aec3f25..a58de1d6206e8ca1afd32db584bb9480d9433a0f 100644 (file)
@@ -5487,9 +5487,9 @@ build_x_unary_op (location_t loc, enum tree_code code, cp_expr xarg,
            {
              if (complain & tf_error)
                error (DECL_CONSTRUCTOR_P (fn)
-                      ? G_("taking address of constructor %qE")
-                      : G_("taking address of destructor %qE"),
-                      xarg.get_value ());
+                      ? G_("taking address of constructor %qD")
+                      : G_("taking address of destructor %qD"),
+                      fn);
              return error_mark_node;
            }
        }
index a8077a53341b9ad9ca83d68b18526586314364c2..58e1b87c6dc70e0e727b001335b4e55dd4684417 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/71440
+       * g++.dg/template/crash127.C: New.
+
 2017-08-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/81052
diff --git a/gcc/testsuite/g++.dg/template/crash127.C b/gcc/testsuite/g++.dg/template/crash127.C
new file mode 100644 (file)
index 0000000..b7c0325
--- /dev/null
@@ -0,0 +1,22 @@
+// PR c++/71440
+
+struct A 
+{
+  void f () {}
+};
+
+typedef void (A::*Ptr) ();
+
+template < Ptr > struct B {};
+
+template < class T > 
+struct C : public A
+{
+  void bar ()
+  {
+    B < &A::A > b;  // { dg-error "taking address of constructor 'A::A" "" { target c++98_only } }
+    // { dg-error "taking address of constructor 'constexpr A::A" "" { target c++11 } .-1 }
+  }
+};
+
+template class C < int >;