aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2005-09-16 01:50:26 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2005-09-16 01:50:26 +0000
commit5c62640040b6ce4932fa2e4574afa5bafa73fce7 (patch)
tree42cb31327a251297cee280781730079e7371a689
parent7d9482d20cd8d739f78fd1aacb6aacfef7a4265b (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/ChangeLog4
-rw-r--r--gcc/cp/pt.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/static17.C13
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>();