Commit 985acf5a by Paolo Carlini Committed by Paolo Carlini

re PR c++/34938 (ICE with function pointers and attribute noreturn)

/cp
2014-08-25  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/34938
	* cp-tree.h (TFF_POINTER): Add.
	* cxx-pretty-print.h (pp_cxx_cv_qualifiers): Forward the third
	argument too.
	* error.c (dump_type_suffix): Actually print the const and noreturn
	attribute when appropriate.

/testsuite
2014-08-25  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/34938
	* g++.dg/template/pr34938-1.C: New.
	* g++.dg/template/pr34938-2.C: Likewise.

From-SVN: r214415
parent 028aee17
2014-08-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/34938
* cp-tree.h (TFF_POINTER): Add.
* cxx-pretty-print.h (pp_cxx_cv_qualifiers): Forward the third
argument too.
* error.c (dump_type_suffix): Actually print the const and noreturn
attribute when appropriate.
2014-08-23 Edward Smith-Rowland <3dw4rd@verizon.net>
* decl.c (compute_array_index_type, grokdeclarator,
......
......@@ -4728,7 +4728,8 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments
identical to their defaults.
TFF_NO_TEMPLATE_BINDINGS: do not print information about the template
arguments for a function template specialization. */
arguments for a function template specialization.
TFF_POINTER: we are printing a pointer type. */
#define TFF_PLAIN_IDENTIFIER (0)
#define TFF_SCOPE (1)
......@@ -4745,6 +4746,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
#define TFF_UNQUALIFIED_NAME (1 << 11)
#define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12)
#define TFF_NO_TEMPLATE_BINDINGS (1 << 13)
#define TFF_POINTER (1 << 14)
/* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
node. */
......
......@@ -59,8 +59,8 @@ struct cxx_pretty_printer : c_pretty_printer
#define pp_cxx_cv_qualifier_seq(PP, T) \
pp_c_type_qualifier_list (PP, T)
#define pp_cxx_cv_qualifiers(PP, CV) \
pp_c_cv_qualifiers (PP, CV, false)
#define pp_cxx_cv_qualifiers(PP, CV, FT) \
pp_c_cv_qualifiers (PP, CV, FT)
#define pp_cxx_whitespace(PP) pp_c_whitespace (PP)
#define pp_cxx_left_paren(PP) pp_c_left_paren (PP)
......
......@@ -820,6 +820,8 @@ dump_type_suffix (cxx_pretty_printer *pp, tree t, int flags)
if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
|| TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
pp_cxx_right_paren (pp);
if (TREE_CODE (t) == POINTER_TYPE)
flags |= TFF_POINTER;
dump_type_suffix (pp, TREE_TYPE (t), flags);
break;
......@@ -839,7 +841,9 @@ dump_type_suffix (cxx_pretty_printer *pp, tree t, int flags)
dump_parameters (pp, arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
pp->padding = pp_before;
pp_cxx_cv_qualifiers (pp, type_memfn_quals (t));
pp_cxx_cv_qualifiers (pp, type_memfn_quals (t),
TREE_CODE (t) == FUNCTION_TYPE
&& (flags & TFF_POINTER));
dump_ref_qualifier (pp, t, flags);
dump_exception_spec (pp, TYPE_RAISES_EXCEPTIONS (t), flags);
dump_type_suffix (pp, TREE_TYPE (t), flags);
......
2014-08-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/34938
* g++.dg/template/pr34938-1.C: New.
* g++.dg/template/pr34938-2.C: Likewise.
2014-08-24 Oleg Endo <olegendo@gcc.gnu.org>
PR target/61996
......
// PR c++/34938
typedef void (*fptr)() __attribute((noreturn));
template<int> void foo();
template<fptr> void bar();
fptr f = bar< foo<0> >; // { dg-error "noreturn" }
// PR c++/34938
template <class T> struct A { };
struct B { };
A<void()const>* p1 = 42; // { dg-error "void\\(\\) const" }
A<void(B::*)()const>* p2 = 42; // { dg-error "void \\(B::\\*\\)\\(\\) const" }
A<void()volatile>* p3 = 42; // { dg-error "void\\(\\) volatile" }
A<void(B::*)()volatile>* p4 = 42; // { dg-error "void \\(B::\\*\\)\\(\\) volatile" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment