re PR c++/71440 (ICE on invalid C++ code in instantiate_type, at cp/class.c:8247)

/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
This commit is contained in:
Paolo Carlini 2017-08-03 09:26:17 +00:00 committed by Paolo Carlini
parent 0a734553cc
commit e5e691a53f
4 changed files with 36 additions and 3 deletions

View 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

View 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;
}
}

View 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

View File

@ -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 >;