diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-10-17 15:41:46 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-10-17 15:41:46 +0000 |
commit | 9579624e7258fc1c5cf8e79a63bbe950deae7c17 (patch) | |
tree | 595c9d55452a0d493a68f4caf4ea21d82b3b3b6d /gcc/cp/pt.c | |
parent | 5511bc2e55b130ef1ce47b47af354ca7876e5ff8 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 24 |
1 files changed, 17 insertions, 7 deletions
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 |