/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 25 Nov 2013 22:24:58 +0000 (22:24 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 25 Nov 2013 22:24:58 +0000 (22:24 +0000)
2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/54485
* decl.c (duplicate_decls): Enforce 8.3.6/6 about default arguments
for member functions of class templates.

/testsuite
2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/54485
* g++.dg/other/default8.C: New.
* g++.dg/tc1/dr217.C: Remove xfail.
* g++.dg/other/default5.C: Adjust.
* g++.old-deja/g++.mike/p1989.C: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205367 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/default5.C
gcc/testsuite/g++.dg/other/default8.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tc1/dr217.C
gcc/testsuite/g++.old-deja/g++.mike/p1989.C

index e567aa0..64f9a23 100644 (file)
@@ -1,5 +1,11 @@
 2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
+       PR c++/54485
+       * decl.c (duplicate_decls): Enforce 8.3.6/6 about default arguments
+       for member functions of class templates.
+
+2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
        PR c++/58607
        * semantics.c (check_constexpr_ctor_body): Check for BIND_EXPR_VARS.
 
index 75e29f4..bf4d8e3 100644 (file)
@@ -1704,25 +1704,47 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
          if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE)
            t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2);
 
-         for (; t1 && t1 != void_list_node;
-              t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++)
-           if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
-             {
-               if (1 == simple_cst_equal (TREE_PURPOSE (t1),
-                                          TREE_PURPOSE (t2)))
+         if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE
+             && CLASSTYPE_TEMPLATE_INFO (CP_DECL_CONTEXT (newdecl)))
+           {
+             /* C++11 8.3.6/6.
+                Default arguments for a member function of a class template
+                shall be specified on the initial declaration of the member
+                function within the class template.  */
+             for (; t2 && t2 != void_list_node; t2 = TREE_CHAIN (t2))
+               if (TREE_PURPOSE (t2))
                  {
-                   permerror (input_location, "default argument given for parameter %d of %q#D",
-                              i, newdecl);
-                   permerror (input_location, "after previous specification in %q+#D", olddecl);
+                   permerror (input_location,
+                              "redeclaration of %q#D may not have default "
+                              "arguments", newdecl);
+                   break;
                  }
-               else
+           }
+         else
+           {
+             for (; t1 && t1 != void_list_node;
+                  t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++)
+               if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
                  {
-                   error ("default argument given for parameter %d of %q#D",
-                          i, newdecl);
-                   error ("after previous specification in %q+#D",
-                                olddecl);
+                   if (1 == simple_cst_equal (TREE_PURPOSE (t1),
+                                              TREE_PURPOSE (t2)))
+                     {
+                       permerror (input_location,
+                                  "default argument given for parameter %d "
+                                  "of %q#D", i, newdecl);
+                       permerror (input_location,
+                                  "after previous specification in %q+#D",
+                                  olddecl);
+                     }
+                   else
+                     {
+                       error ("default argument given for parameter %d "
+                              "of %q#D", i, newdecl);
+                       error ("after previous specification in %q+#D",
+                              olddecl);
+                     }
                  }
-             }
+           }
        }
     }
 
index 920f826..2e9ff15 100644 (file)
@@ -1,5 +1,13 @@
 2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
+       PR c++/54485
+       * g++.dg/other/default8.C: New.
+       * g++.dg/tc1/dr217.C: Remove xfail.
+       * g++.dg/other/default5.C: Adjust.
+       * g++.old-deja/g++.mike/p1989.C: Likewise.
+
+2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
        PR c++/58607
        * g++.dg/cpp0x/constexpr-ice9.C: New.
 
index d5bae34..87acb76 100644 (file)
@@ -43,5 +43,5 @@ template<int> struct B
   void F2(int, int, int = 0);
 };
 
-template<int N> void B<N>::F1(int, int = 0, int) {}
-template<int N> void B<N>::F2(int = 0, int, int) {}  // { dg-error "default" }
+template<int N> void B<N>::F1(int, int = 0, int) {}  // { dg-error "default arguments" }
+template<int N> void B<N>::F2(int = 0, int, int) {}  // { dg-error "default arguments|parameter 2" }
diff --git a/gcc/testsuite/g++.dg/other/default8.C b/gcc/testsuite/g++.dg/other/default8.C
new file mode 100644 (file)
index 0000000..255a661
--- /dev/null
@@ -0,0 +1,43 @@
+// PR c++54485
+
+template<typename T>
+class K1
+{
+  int fn(int, int);
+  int gn(int, int);
+};
+
+template<typename T>
+int K1<T>::fn (int a, int b = 3)      // { dg-error "default arguments" }
+{
+  return a - b;
+}
+
+template<typename T>
+int K1<T>::gn (int a = 1, int b = 3)  // { dg-error "default arguments" }
+{
+  return a - b;
+}
+
+template<typename T>
+class K2
+{
+  template<typename U>
+  int fn(int, int);
+  template<typename U>
+  int gn(int, int);
+};
+
+template<typename T>
+template<typename U>
+int K2<T>::fn (int a, int b = 3)  // { dg-error "default arguments" }
+{
+  return a - b;
+}
+
+template<typename T>
+template<typename U>
+int K2<T>::gn (int a = 1, int b = 3)  // { dg-error "default arguments" }
+{
+  return a - b;
+}
index cfa2803..099359b 100644 (file)
@@ -10,5 +10,5 @@ struct S
 };
 
 template <class T>
-void S<T>::foo (int = 0)  // { dg-error "" "default arguments for parameters of member functions of class templates can be specified in the initial declaration only" { xfail *-*-* } }
+void S<T>::foo (int = 0)  // { dg-error "" "default arguments for parameters of member functions of class templates can be specified in the initial declaration only" }
 { }
index 487f609..fdede63 100644 (file)
@@ -108,7 +108,7 @@ List_DL<T>::prepend(const T& item)
 
 template<class T>
 void
-List_DL<T>::insert(const T& item, Pix x, bool before = TRUE)
+List_DL<T>::insert(const T& item, Pix x, bool before = TRUE)  // { dg-error "default arguments" }
 {
     link<T> *l = (link<T> *) x;