This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++0x PATCH for c++/46129 (ICE with default argument in member class of template)
- From: Jason Merrill <jason at redhat dot com>
- To: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 22 Oct 2010 14:29:31 -0400
- Subject: C++0x PATCH for c++/46129 (ICE with default argument in member class of template)
The testcase in this PR was causing an ICE because we were running
tsubst on a default argument that had already been tsubsted. The bug
turned out to be that the initial tsubst shouldn't have happened;
default arguments in a template should not be instantiated until they
are used.
Tested x86_64-pc-linux-gnu, applied to trunk.
commit 70699d1c4404551084003c2836e2ee0708987f92
Author: Jason Merrill <jason@redhat.com>
Date: Fri Oct 22 10:23:20 2010 -0400
PR c++/46129
* pt.c (instantiate_class_template): Don't instantiate default
arguments.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 85a5ea5..19e8512 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -8238,17 +8238,12 @@ instantiate_class_template (tree type)
finish_struct_1 (type);
TYPE_BEING_DEFINED (type) = 0;
- /* Now that the class is complete, instantiate default arguments for
- any member functions. We don't do this earlier because the
- default arguments may reference members of the class. */
- if (!PRIMARY_TEMPLATE_P (templ))
- for (t = TYPE_METHODS (type); t; t = DECL_CHAIN (t))
- if (TREE_CODE (t) == FUNCTION_DECL
- /* Implicitly generated member functions will not have template
- information; they are not instantiations, but instead are
- created "fresh" for each instantiation. */
- && DECL_TEMPLATE_INFO (t))
- tsubst_default_arguments (t);
+ /* We don't instantiate default arguments for member functions. 14.7.1:
+
+ The implicit instantiation of a class template specialization causes
+ the implicit instantiation of the declarations, but not of the
+ definitions or default arguments, of the class member functions,
+ member classes, static data members and member templates.... */
/* Some typedefs referenced from within the template code need to be access
checked at template instantiation time, i.e now. These types were
diff --git a/gcc/testsuite/g++.dg/template/defarg14.C b/gcc/testsuite/g++.dg/template/defarg14.C
new file mode 100644
index 0000000..1fe87e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/defarg14.C
@@ -0,0 +1,13 @@
+// PR c++/46129
+// The default argument for A<int>::B::operator() should not be instantiated
+
+template <class T>
+struct A {
+ struct B {
+ void operator () (const T& d_ = f(T()) ) { }
+ };
+};
+
+int main() {
+ A<int>::B b;
+}