summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2015-10-05 21:43:26 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2015-10-05 21:43:26 +0000
commita099bc9f74a629f544b3c96637bb633d15f617b8 (patch)
tree16a91a2a7953eecb0f4924ad7e801db88fb7a105
parent5260b0ab617b5bab1a9a0be345437652b3e8a49c (diff)
downloadgcc-a099bc9f74a629f544b3c96637bb633d15f617b8.tar.gz
/cp
2015-10-05 Paolo Carlini <paolo.carlini@oracle.com> PR c++/53856 * pt.c (check_default_tmpl_args): Per [temp.param]/9, do not reject default template arguments in out of class definitions of members of non-template classes. /testsuite 2015-10-05 Paolo Carlini <paolo.carlini@oracle.com> PR c++/53856 * g++.dg/template/defarg19.C: New. * g++.dg/template/defarg20.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228501 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/template/defarg19.C15
-rw-r--r--gcc/testsuite/g++.dg/template/defarg20.C15
5 files changed, 51 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d4fd5146eed..63ed0473f2d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2015-10-05 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/53856
+ * pt.c (check_default_tmpl_args): Per [temp.param]/9, do not
+ reject default template arguments in out of class definitions
+ of members of non-template classes.
+
2015-10-05 Richard Sandiford <richard.sandiford@arm.com>
* tree.c (cp_tree_equal): Use real_equal instead of
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index db947cc632e..6520b8b31e5 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4940,8 +4940,15 @@ check_default_tmpl_args (tree decl, tree parms, bool is_primary,
else if (is_partial)
msg = G_("default template arguments may not be used in "
"partial specializations");
- else
+ else if (current_class_type && CLASSTYPE_IS_TEMPLATE (current_class_type))
msg = G_("default argument for template parameter for class enclosing %qD");
+ else
+ /* Per [temp.param]/9, "A default template-argument shall not be
+ specified in the template-parameter-lists of the definition of
+ a member of a class template that appears outside of the member's
+ class.", thus if we aren't handling a member of a class template
+ there is no need to examine the parameters. */
+ return true;
if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
/* If we're inside a class definition, there's no need to
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cbec9c9fb12..3d268e7206c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-05 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/53856
+ * g++.dg/template/defarg19.C: New.
+ * g++.dg/template/defarg20.C: Likewise.
+
2015-10-05 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com>
diff --git a/gcc/testsuite/g++.dg/template/defarg19.C b/gcc/testsuite/g++.dg/template/defarg19.C
new file mode 100644
index 00000000000..856980232f4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/defarg19.C
@@ -0,0 +1,15 @@
+// PR c++/53856
+
+template<typename T>
+struct A
+{
+ struct B;
+};
+
+template<typename T = int>
+struct A<T>::B // { dg-error "default argument" }
+{
+ int i;
+};
+
+A<int>::B b = { };
diff --git a/gcc/testsuite/g++.dg/template/defarg20.C b/gcc/testsuite/g++.dg/template/defarg20.C
new file mode 100644
index 00000000000..de8aac11ec2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/defarg20.C
@@ -0,0 +1,15 @@
+// PR c++/53856
+
+struct A
+{
+ template<typename T>
+ struct B;
+};
+
+template<typename T = int>
+struct A::B
+{
+ int i;
+};
+
+A::B<int> b = { };