]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/54485 (g++ should diagnose default arguments in out-of-line definitions...
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 25 Nov 2013 22:24:58 +0000 (22:24 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 25 Nov 2013 22:24:58 +0000 (22:24 +0000)
/cp
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.

From-SVN: r205367

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 e567aa0c9da6bbf98ca071f27a83ee667cdee736..64f9a23632db3289c226d975d137e56ae9f8efbd 100644 (file)
@@ -1,3 +1,9 @@
+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
index 75e29f4bfa229c79589aca438bed96cef0369548..bf4d8e3d6846e6dd00a293609f1e95c548a39846 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 920f8268c352f13baea74712f3a3506941f74ee7..2e9ff158fb286485bb5748dbe5040774750a3c86 100644 (file)
@@ -1,3 +1,11 @@
+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
index d5bae344c4470ebe07f01cafbc60678deb3b6e08..87acb765e6d61014e741517e9b19e4b06a92439b 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 cfa2803974d673166e26ca1f2746faa0a9b82191..099359b216a70e6493c6a96c94dd1dae9e351c65 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 487f609a1451a8f4195a8c49edca4d299892bf3d..fdede63e406e05f2187b9ba466b2eff9f5de79ec 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;