/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 25 Aug 2014 08:32:04 +0000 (08:32 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 25 Aug 2014 08:32:04 +0000 (08:32 +0000)
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

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/cxx-pretty-print.h
gcc/cp/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr34938-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/pr34938-2.C [new file with mode: 0644]

index e770ab0..18a281b 100644 (file)
@@ -1,3 +1,12 @@
+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,
index 5d4df6b..43818cd 100644 (file)
@@ -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.  */
index 2dc3f95..9bdd4b6 100644 (file)
@@ -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)
index 9f0498d..86fd405 100644 (file)
@@ -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);
index 82e1047..eb06e0b 100644 (file)
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/g++.dg/template/pr34938-1.C b/gcc/testsuite/g++.dg/template/pr34938-1.C
new file mode 100644 (file)
index 0000000..f23a5a3
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/34938
+
+typedef void (*fptr)() __attribute((noreturn)); 
+template<int>  void foo();
+template<fptr> void bar();
+
+fptr f = bar< foo<0> >;   // { dg-error "noreturn" }
diff --git a/gcc/testsuite/g++.dg/template/pr34938-2.C b/gcc/testsuite/g++.dg/template/pr34938-2.C
new file mode 100644 (file)
index 0000000..fe7650f
--- /dev/null
@@ -0,0 +1,10 @@
+// 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" }