From fbfe8c9e5ab2168a5776947525909c485afe39f3 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 1 Mar 2001 14:01:39 +0000 Subject: [PATCH] Implement using decls inside template functions. cp: Implement using decls inside template functions. * decl2.c (validate_nonmember_using_decl): Don't special case fake_std_node in the global namespace. Don't reject early when processing a template. (do_local_using_decl): Add to statement tree. Don't do further processing when building a template. * pt.c (tsubst_expr, DECL_STMT case): Deal with USING_DECLs. testsuite: * g++.old-deja/g++.pt/using1.C: New test. From-SVN: r40151 --- gcc/cp/ChangeLog | 10 +++++++++ gcc/cp/decl2.c | 19 +++++++--------- gcc/cp/pt.c | 8 +++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.old-deja/g++.pt/using1.C | 36 ++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/using1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c5d0c95..053c227 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,15 @@ 2001-03-01 Nathan Sidwell + Implement using decls inside template functions. + * decl2.c (validate_nonmember_using_decl): Don't special case + fake_std_node in the global namespace. Don't reject early when + processing a template. + (do_local_using_decl): Add to statement tree. Don't do further + processing when building a template. + * pt.c (tsubst_expr, DECL_STMT case): Deal with USING_DECLs. + +2001-03-01 Nathan Sidwell + * decl2.c (do_nonmember_using_decl): Don't complain if we find same function. Do complain about ambiguating extern "C" declarations. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index d115dcc..000eb78 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -5032,16 +5032,6 @@ validate_nonmember_using_decl (decl, scope, name) if (TREE_CODE (decl) == SCOPE_REF && TREE_OPERAND (decl, 0) == fake_std_node) { - if (namespace_bindings_p () - && current_namespace == global_namespace) - /* There's no need for a using declaration at all, here, - since `std' is the same as `::'. We can't just pass this - on because we'll complain later about declaring something - in the same scope as a using declaration with the same - name. We return NULL_TREE which indicates to the caller - that there's no need to do any further processing. */ - return NULL_TREE; - *scope = global_namespace; *name = TREE_OPERAND (decl, 1); } @@ -5054,7 +5044,8 @@ validate_nonmember_using_decl (decl, scope, name) A using-declaration for a class member shall be a member-declaration. */ - if (TREE_CODE (*scope) != NAMESPACE_DECL) + if (!processing_template_decl + && TREE_CODE (*scope) != NAMESPACE_DECL) { if (TYPE_P (*scope)) cp_error ("`%T' is not a namespace", *scope); @@ -5212,6 +5203,12 @@ do_local_using_decl (decl) if (decl == NULL_TREE) return; + if (building_stmt_tree () + && at_function_scope_p ()) + add_decl_stmt (decl); + if (processing_template_decl) + return; + oldval = lookup_name_current_level (name); oldtype = lookup_type_current_level (name); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 331b307..0994d67 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7299,6 +7299,14 @@ tsubst_expr (t, args, complain, in_decl) decl = DECL_STMT_DECL (t); if (TREE_CODE (decl) == LABEL_DECL) finish_label_decl (DECL_NAME (decl)); + else if (TREE_CODE (decl) == USING_DECL) + { + tree scope = DECL_INITIAL (decl); + tree name = DECL_NAME (decl); + + scope = tsubst_expr (scope, args, complain, in_decl); + do_local_using_decl (build_nt (SCOPE_REF, scope, name)); + } else { init = DECL_INITIAL (decl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 414c253..0a1a3ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2001-03-01 Nathan Sidwell + * g++.old-deja/g++.pt/using1.C: New test. + +2001-03-01 Nathan Sidwell + * g++.old-deja/g++.other/using9.C: New test. 2001-02-28 Ovidiu Predescu diff --git a/gcc/testsuite/g++.old-deja/g++.pt/using1.C b/gcc/testsuite/g++.old-deja/g++.pt/using1.C new file mode 100644 index 0000000..eca6c50 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/using1.C @@ -0,0 +1,36 @@ +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Feb 2001 + +// Bug 1981. using declarations in namespace scope were not remembered. + +namespace A +{ + void swap () {} +}; + +template void f() +{ + using A::swap; +} + +template void f (); + +namespace B +{ + int foo (int) { return 1;} + + template int baz () + { + using ::foo; + + return foo (1); + } + template int baz (); +}; + +int foo (int) { return 0;} + +int main () +{ + return B::baz (); +} -- 2.7.4