mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-11 01:30:55 +08:00
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:
parent
f91352dcc3
commit
59dd34c408
@ -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.
|
||||
|
||||
|
17
gcc/cp/pt.c
17
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
|
||||
|
@ -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
|
||||
|
13
gcc/testsuite/g++.dg/template/defarg14.C
Normal file
13
gcc/testsuite/g++.dg/template/defarg14.C
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user