re PR c++/23896 (boost::tie() = std::pair doesn't compile)

PR c++/23896
	* pt.c (tsubst_aggr_type): Make sure skip_evaluation is false when
	processing template arguments.

	PR c++/23896
	* g++.dg/template/static17.C: New test.

From-SVN: r104336
This commit is contained in:
Mark Mitchell 2005-09-16 01:50:26 +00:00 committed by Mark Mitchell
parent bba35acfce
commit 3489ea0cb1
4 changed files with 37 additions and 5 deletions

View File

@ -1,5 +1,9 @@
2005-09-15 Mark Mitchell <mark@codesourcery.com>
PR c++/23896
* pt.c (tsubst_aggr_type): Make sure skip_evaluation is false when
processing template arguments.
* pt.c (check_explicit_instantiation_namespace): Fix typo.
PR c++/13140

View File

@ -6069,6 +6069,11 @@ tsubst_aggr_type (tree t,
tree argvec;
tree context;
tree r;
bool saved_skip_evaluation;
/* In "sizeof(X<I>)" we need to evaluate "I". */
saved_skip_evaluation = skip_evaluation;
skip_evaluation = false;
/* First, determine the context for the type we are looking
up. */
@ -6089,12 +6094,17 @@ tsubst_aggr_type (tree t,
argvec = tsubst_template_args (TYPE_TI_ARGS (t), args,
complain, in_decl);
if (argvec == error_mark_node)
return error_mark_node;
r = error_mark_node;
else
{
r = lookup_template_class (t, argvec, in_decl, context,
entering_scope, complain);
r = cp_build_qualified_type_real (r, TYPE_QUALS (t), complain);
}
return cp_build_qualified_type_real (r, TYPE_QUALS (t), complain);
skip_evaluation = saved_skip_evaluation;
return r;
}
else
/* This is not a template type, so there's nothing to do. */

View File

@ -1,3 +1,8 @@
2005-09-15 Mark Mitchell <mark@codesourcery.com>
PR c++/23896
* g++.dg/template/static17.C: New test.
2005-09-15 Joseph S. Myers <joseph@codesourcery.com>
PR c++/23139

View File

@ -0,0 +1,13 @@
// PR c++/23896
template <int> struct X {};
template <typename T> struct length {
static const int value = 2;
};
template <typename T> void foo () {
sizeof(X<length<T>::value>);
}
template void foo<int>();