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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214415
138bc75d-0d04-0410-961f-
82ee72b054a4
+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,
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)
#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. */
#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)
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;
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
--- /dev/null
+// PR c++/34938
+
+typedef void (*fptr)() __attribute((noreturn));
+template<int> void foo();
+template<fptr> void bar();
+
+fptr f = bar< foo<0> >; // { dg-error "noreturn" }
--- /dev/null
+// 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" }