summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-06 16:04:08 +0000
committergdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-06 16:04:08 +0000
commiteba961e2d18a3c89cd5cc72eddc3b16bea002278 (patch)
tree1993644e70dfb92ec05b33c858202615ffdf6f75
parent3685c73bfc2d14fc368603d4924f4e790611576d (diff)
downloadgcc-eba961e2d18a3c89cd5cc72eddc3b16bea002278.tar.gz
cp/
Don't allow template-id in using-declaration. * decl2.c (validate_nonmember_using_decl): Handle template-ids. (do_class_using_decl): Likewise. testsuite/ * g++.dg/other/using-declaration.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44663 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c44
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/other/using-declaration.C44
4 files changed, 84 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2911f991c41..470fd821188 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2001-08-05 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
+
+ Don't allow template-id in using-declaration.
+ * decl2.c (validate_nonmember_using_decl): Handle template-ids.
+ (do_class_using_decl): Likewise.
+
2001-08-04 Neil Booth <neil@cat.daikokuya.demon.co.uk>
* cp/spew.c (read_token): No need to pop buffers.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 666c31b81a3..d35ab7195d2 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4913,19 +4913,29 @@ validate_nonmember_using_decl (decl, scope, name)
*scope = TREE_OPERAND (decl, 0);
*name = TREE_OPERAND (decl, 1);
- /* [namespace.udecl]
-
- A using-declaration for a class member shall be a
- member-declaration. */
- if (!processing_template_decl
- && TREE_CODE (*scope) != NAMESPACE_DECL)
- {
- if (TYPE_P (*scope))
- cp_error ("`%T' is not a namespace", *scope);
- else
- cp_error ("`%D' is not a namespace", *scope);
- return NULL_TREE;
- }
+ if (!processing_template_decl)
+ {
+ /* [namespace.udecl]
+ A using-declaration for a class member shall be a
+ member-declaration. */
+ if(TREE_CODE (*scope) != NAMESPACE_DECL)
+ {
+ if (TYPE_P (*scope))
+ cp_error ("`%T' is not a namespace", *scope);
+ else
+ cp_error ("`%D' is not a namespace", *scope);
+ return NULL_TREE;
+ }
+
+ /* 7.3.3/5
+ A using-declaration shall not name a template-id. */
+ if (TREE_CODE (*name) == TEMPLATE_ID_EXPR)
+ {
+ *name = TREE_OPERAND (*name, 0);
+ cp_error ("a using-declaration cannot specify a template-id. Try `using %D'", *name);
+ return NULL_TREE;
+ }
+ }
}
else if (TREE_CODE (decl) == IDENTIFIER_NODE
|| TREE_CODE (decl) == TYPE_DECL
@@ -5129,7 +5139,13 @@ do_class_using_decl (decl)
cp_error ("using-declaration for destructor");
return NULL_TREE;
}
- if (TREE_CODE (name) == TYPE_DECL)
+ else if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
+ {
+ name = TREE_OPERAND (name, 0);
+ cp_error ("a using-declaration cannot specify a template-id. Try `using %T::%D'", TREE_OPERAND (decl, 0), name);
+ return NULL_TREE;
+ }
+ if (TREE_CODE (name) == TYPE_DECL || TREE_CODE (name) == TEMPLATE_DECL)
name = DECL_NAME (name);
my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9e3c8c89b16..3b5930e8d4d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2001-08-05 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
+
+ * g++.dg/other/using-declaration.C: New test.
+
2001-08-05 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/tr-sign.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/other/using-declaration.C b/gcc/testsuite/g++.dg/other/using-declaration.C
new file mode 100644
index 00000000000..aac33423336
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/using-declaration.C
@@ -0,0 +1,44 @@
+// Copyright (C) 2001 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+
+// { dg-do compile }
+
+namespace N
+{
+ template<int> void f() {}
+}
+
+using N::f< 0 >; // { dg-error "using-declaration" "" }
+
+struct A {
+ template <class T> void f(T);
+ template <class T> struct X { };
+};
+
+struct B : A {
+ using A::X; // OK
+ using A::f; // OK
+};
+
+struct C : A {
+ using A::f<double>; // { dg-error "using-declaration" "" }
+ using A::X<int>; // { dg-error "parse error" "" }
+};
+