diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-09-16 01:50:26 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-09-16 01:50:26 +0000 |
commit | 5c62640040b6ce4932fa2e4574afa5bafa73fce7 (patch) | |
tree | 42cb31327a251297cee280781730079e7371a689 | |
parent | 7d9482d20cd8d739f78fd1aacb6aacfef7a4265b (diff) |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104336 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/static17.C | 13 |
4 files changed, 37 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 868ef3a4f66..188189f5490 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8840d27f24b..ece96146c2e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 = lookup_template_class (t, argvec, in_decl, context, - entering_scope, complain); + 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); + } + + skip_evaluation = saved_skip_evaluation; - return cp_build_qualified_type_real (r, TYPE_QUALS (t), complain); + return r; } else /* This is not a template type, so there's nothing to do. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39fc06a81d7..e9b96a98698 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/template/static17.C b/gcc/testsuite/g++.dg/template/static17.C new file mode 100644 index 00000000000..bf79bccc328 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static17.C @@ -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>(); |