diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-11-25 22:24:58 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-11-25 22:24:58 +0000 |
commit | 97d12d29aaf0502b243d7a39dc22bd7a8074b039 (patch) | |
tree | 953843fe30524203dce49ad0d86d59500fe7b653 /gcc | |
parent | 4fd602a1e050ca035265ae53f2dfe721505811a5 (diff) | |
download | gcc-97d12d29aaf0502b243d7a39dc22bd7a8074b039.zip gcc-97d12d29aaf0502b243d7a39dc22bd7a8074b039.tar.gz gcc-97d12d29aaf0502b243d7a39dc22bd7a8074b039.tar.bz2 |
re PR c++/54485 (g++ should diagnose default arguments in out-of-line definitions for template class member functions)
/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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 52 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/default5.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/default8.C | 43 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tc1/dr217.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.mike/p1989.C | 2 |
7 files changed, 98 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e567aa0..64f9a23 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 75e29f4..bf4d8e3 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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); + } } - } + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 920f826..2e9ff15 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/other/default5.C b/gcc/testsuite/g++.dg/other/default5.C index d5bae34..87acb76 100644 --- a/gcc/testsuite/g++.dg/other/default5.C +++ b/gcc/testsuite/g++.dg/other/default5.C @@ -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 index 0000000..255a661 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default8.C @@ -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; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr217.C b/gcc/testsuite/g++.dg/tc1/dr217.C index cfa2803..099359b 100644 --- a/gcc/testsuite/g++.dg/tc1/dr217.C +++ b/gcc/testsuite/g++.dg/tc1/dr217.C @@ -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" } { } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p1989.C b/gcc/testsuite/g++.old-deja/g++.mike/p1989.C index 487f609..fdede63 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p1989.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p1989.C @@ -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; |