aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2003-10-17 15:41:46 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2003-10-17 15:41:46 +0000
commit9579624e7258fc1c5cf8e79a63bbe950deae7c17 (patch)
tree595c9d55452a0d493a68f4caf4ea21d82b3b3b6d
parent5511bc2e55b130ef1ce47b47af354ca7876e5ff8 (diff)
downloadgcc-9579624e7258fc1c5cf8e79a63bbe950deae7c17.zip
gcc-9579624e7258fc1c5cf8e79a63bbe950deae7c17.tar.gz
gcc-9579624e7258fc1c5cf8e79a63bbe950deae7c17.tar.bz2
re PR c++/2513 (internal template template parameter causes ICE)
PR c++/2513 * decl.c (make_typename_type): Use dependent_type_p. (make_unbound_class_template): Likewise. * pt.c (instantiate_class_template): Increment processing_template_decl during substitution of template friend function. Preincrement processing_template_decl rather than postincrement. (get_mostly_instantiated_function_type): Increment processing_template_decl during partial substitution of function type. * g++.dg/template/typename5.C: New test. From-SVN: r72611
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/decl.c6
-rw-r--r--gcc/cp/pt.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/typename5.C19
5 files changed, 57 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8173021..b5cba3c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,16 @@
+2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/2513
+ * decl.c (make_typename_type): Use dependent_type_p.
+ (make_unbound_class_template): Likewise.
+ * pt.c (instantiate_class_template): Increment
+ processing_template_decl during substitution of template friend
+ function. Preincrement processing_template_decl rather than
+ postincrement.
+ (get_mostly_instantiated_function_type): Increment
+ processing_template_decl during partial substitution of function
+ type.
+
2003-10-15 Jan Hubicka <jh@suse.cz>
pr c++/12574
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 7b0f868..227c773 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2604,7 +2604,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
return error_mark_node;
}
- if (! uses_template_parms (context)
+ if (!dependent_type_p (context)
|| currently_open_class (context))
{
if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR)
@@ -2663,7 +2663,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
/* If the CONTEXT is not a template type, then either the field is
there now or its never going to be. */
- if (!uses_template_parms (context))
+ if (!dependent_type_p (context))
{
if (complain & tf_error)
error ("no type named `%#T' in `%#T'", name, context);
@@ -2692,7 +2692,7 @@ make_unbound_class_template (tree context, tree name, tsubst_flags_t complain)
if (TREE_CODE (name) != IDENTIFIER_NODE)
abort ();
- if (!uses_template_parms (context)
+ if (!dependent_type_p (context)
|| currently_open_class (context))
{
tree tmpl = NULL_TREE;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 909eede..ffc347c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5294,10 +5294,10 @@ instantiate_class_template (tree type)
tree r;
if (TREE_CODE (t) == TEMPLATE_DECL)
- processing_template_decl++;
+ ++processing_template_decl;
r = tsubst (t, args, tf_error, NULL_TREE);
if (TREE_CODE (t) == TEMPLATE_DECL)
- processing_template_decl--;
+ --processing_template_decl;
set_current_access_from_decl (r);
grok_special_member_properties (r);
finish_member_declaration (r);
@@ -5317,10 +5317,10 @@ instantiate_class_template (tree type)
input_location = DECL_SOURCE_LOCATION (t);
if (TREE_CODE (t) == TEMPLATE_DECL)
- processing_template_decl++;
+ ++processing_template_decl;
r = tsubst (t, args, tf_error | tf_warning, NULL_TREE);
if (TREE_CODE (t) == TEMPLATE_DECL)
- processing_template_decl--;
+ --processing_template_decl;
if (TREE_CODE (r) == VAR_DECL)
{
tree init;
@@ -5412,9 +5412,17 @@ instantiate_class_template (tree type)
--processing_template_decl;
}
else
- /* Build new DECL_FRIENDLIST. */
- add_friend (type, tsubst_friend_function (t, args),
- /*complain=*/false);
+ {
+ /* Build new DECL_FRIENDLIST. */
+ tree r;
+
+ if (TREE_CODE (t) == TEMPLATE_DECL)
+ ++processing_template_decl;
+ r = tsubst_friend_function (t, args);
+ if (TREE_CODE (t) == TEMPLATE_DECL)
+ --processing_template_decl;
+ add_friend (type, r, /*complain=*/false);
+ }
}
}
@@ -11246,9 +11254,11 @@ get_mostly_instantiated_function_type (tree decl)
specialized or not. */
push_access_scope (decl);
+ ++processing_template_decl;
/* Now, do the (partial) substitution to figure out the
appropriate function type. */
fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE);
+ --processing_template_decl;
/* Substitute into the template parameters to obtain the real
innermost set of parameters. This step is important if the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3f00636..5cfe1e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+ PR c++/2513
+ * g++.dg/template/typename5.C: New test.
+
+2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
PR c++/12369
* g++.dg/template/friend25.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/typename5.C b/gcc/testsuite/g++.dg/template/typename5.C
new file mode 100644
index 0000000..2f72b5f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/typename5.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Origin: ariels@compugen.co.il
+
+// PR c++/2513: typename handling when scope is dependent as
+// described in DR108.
+
+template <bool flag> struct Select {
+ typedef int Result;
+};
+
+template <template<class> class Pred> struct FindType {
+ typedef typename Select<true>::Result Result;
+};
+
+template <int bits> struct Int {
+ template<typename T> struct RightSize {};
+ typedef typename FindType<RightSize>::Result type;
+};