re PR c++/46129 (ICE: in tsubst_copy, at cp/pt.c:11375)

PR c++/46129
	* pt.c (instantiate_class_template): Don't instantiate default
	arguments.

From-SVN: r165850
This commit is contained in:
Jason Merrill 2010-10-22 14:37:53 -04:00 committed by Jason Merrill
parent f91352dcc3
commit 59dd34c408
4 changed files with 28 additions and 11 deletions

View File

@ -1,5 +1,9 @@
2010-10-22 Jason Merrill <jason@redhat.com>
PR c++/46129
* pt.c (instantiate_class_template): Don't instantiate default
arguments.
PR c++/46103
* init.c (build_vec_init): Handle memberwise move.

View File

@ -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

View File

@ -1,3 +1,8 @@
2010-10-22 Jason Merrill <jason@redhat.com>
PR c++/46129
* g++.dg/template/defarg14.C: New.
2010-10-22 Jason Merrill <jason@redhat.com>
PR c++/46103

View File

@ -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;
}