]> gcc.gnu.org Git - gcc.git/commitdiff
Implement using decls inside template functions.
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 1 Mar 2001 14:01:39 +0000 (14:01 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 1 Mar 2001 14:01:39 +0000 (14:01 +0000)
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
gcc/cp/decl2.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/using1.C [new file with mode: 0644]

index c5d0c9516d9c494afcd4637e1116ebf41cb02f35..053c227cf6240db85674f60d3f629fa9d5a15817 100644 (file)
@@ -1,3 +1,13 @@
+2001-03-01  Nathan Sidwell  <nathan@codesourcery.com>
+
+       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  <nathan@codesourcery.com>
 
        * decl2.c (do_nonmember_using_decl): Don't complain if we find
index d115dccdeee40322e6f4e2e91416ef971c62d65d..000eb78ee6a097845d92e5946a6ada9d0b917100 100644 (file)
@@ -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);
 
index 331b307dc3d22133b06f54baf3cb7d7bd8969834..0994d670cc88a55da0af5b94e55f8b0f33238ccd 100644 (file)
@@ -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);
index 414c253c9481f73fd8f8cb034fbf800b534be3a5..0a1a3ecaf408f27a76e352cb23ee01507c52408c 100644 (file)
@@ -1,3 +1,7 @@
+2001-03-01  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/using1.C: New test.
+
 2001-03-01  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.old-deja/g++.other/using9.C: New test.
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 (file)
index 0000000..eca6c50
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Feb 2001 <nathan@codesourcery.com>
+
+// Bug 1981. using declarations in namespace scope were not remembered.
+
+namespace A
+{
+  void swap () {}
+};
+
+template <class T> void f()
+{
+  using A::swap;
+}
+
+template void f<float> ();
+
+namespace B
+{
+  int foo (int) { return 1;}
+  
+  template <class T> int baz ()
+  {
+    using ::foo;
+    
+    return foo (1);
+  }
+  template int baz<float> ();
+};
+
+int foo (int) { return 0;}
+
+int main ()
+{
+  return B::baz<float> ();
+}
This page took 0.210529 seconds and 5 git commands to generate.