Commit 1e9f5818 by Fabien Chêne

re PR c++/23211 (using dec in nested class doesn't import name)

gcc/testsuite/ChangeLog

2011-12-28  Fabien Chene  <fabien@gcc.gnu.org>

	PR c++/23211
	* g++.dg/template/using18.C: New.
	* g++.dg/template/using19.C: New.
	* g++.dg/template/nested3.C: Remove dg-message at instantiation.
	* g++.dg/template/crash13.C: Likewise.

gcc/cp/ChangeLog

2011-12-28  Fabien Chene  <fabien@gcc.gnu.org>

	PR c++/23211
	* name-lookup.c (do_class_using_decl): Use dependent_scope_p
	instead of dependent_type_p, to check that a non-dependent
	nested-name-specifier of a class-scope using declaration refers to
	a base, even if the current scope is dependent.
	* parser.c (cp_parser_using_declaration): Set
	USING_DECL_TYPENAME_P to 1 if the DECL is not null. Re-indent a
	'else' close to the prior modification.

From-SVN: r182711
parent 37f3b680
2011-12-27 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/23211
* name-lookup.c (do_class_using_decl): Use dependent_scope_p
instead of dependent_type_p, to check that a non-dependent
nested-name-specifier of a class-scope using declaration refers to
a base, even if the current scope is dependent.
* parser.c (cp_parser_using_declaration): Set
USING_DECL_TYPENAME_P to 1 if the DECL is not null. Re-indent a
'else' close to the prior modification.
2011-12-23 Jason Merrill <jason@redhat.com> 2011-12-23 Jason Merrill <jason@redhat.com>
PR c++/51507 PR c++/51507
......
...@@ -3217,7 +3217,7 @@ do_class_using_decl (tree scope, tree name) ...@@ -3217,7 +3217,7 @@ do_class_using_decl (tree scope, tree name)
return NULL_TREE; return NULL_TREE;
} }
scope_dependent_p = dependent_type_p (scope); scope_dependent_p = dependent_scope_p (scope);
name_dependent_p = (scope_dependent_p name_dependent_p = (scope_dependent_p
|| (IDENTIFIER_TYPENAME_P (name) || (IDENTIFIER_TYPENAME_P (name)
&& dependent_type_p (TREE_TYPE (name)))); && dependent_type_p (TREE_TYPE (name))));
...@@ -3242,9 +3242,9 @@ do_class_using_decl (tree scope, tree name) ...@@ -3242,9 +3242,9 @@ do_class_using_decl (tree scope, tree name)
In general, we cannot check this constraint in a template because In general, we cannot check this constraint in a template because
we do not know the entire set of base classes of the current we do not know the entire set of base classes of the current
class type. However, if all of the base classes are class type. Morover, if SCOPE is dependent, it might match a
non-dependent, then we can avoid delaying the check until non-dependent base. */
instantiation. */
if (!scope_dependent_p) if (!scope_dependent_p)
{ {
base_kind b_kind; base_kind b_kind;
...@@ -3270,7 +3270,7 @@ do_class_using_decl (tree scope, tree name) ...@@ -3270,7 +3270,7 @@ do_class_using_decl (tree scope, tree name)
if (BASELINK_P (decl)) if (BASELINK_P (decl))
decl = BASELINK_FUNCTIONS (decl); decl = BASELINK_FUNCTIONS (decl);
} }
} }
value = build_lang_decl (USING_DECL, name, NULL_TREE); value = build_lang_decl (USING_DECL, name, NULL_TREE);
USING_DECL_DECLS (value) = decl; USING_DECL_DECLS (value) = decl;
......
...@@ -14971,12 +14971,12 @@ cp_parser_using_declaration (cp_parser* parser, ...@@ -14971,12 +14971,12 @@ cp_parser_using_declaration (cp_parser* parser,
/* Create the USING_DECL. */ /* Create the USING_DECL. */
decl = do_class_using_decl (parser->scope, identifier); decl = do_class_using_decl (parser->scope, identifier);
if (typename_p) if (decl && typename_p)
USING_DECL_TYPENAME_P (decl) = 1; USING_DECL_TYPENAME_P (decl) = 1;
if (check_for_bare_parameter_packs (decl)) if (check_for_bare_parameter_packs (decl))
return false; return false;
else else
/* Add it to the list of members in this class. */ /* Add it to the list of members in this class. */
finish_member_declaration (decl); finish_member_declaration (decl);
} }
......
2011-12-27 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/23211
* g++.dg/template/using18.C: New.
* g++.dg/template/using19.C: New.
* g++.dg/template/nested3.C: Remove dg-message at instantiation.
* g++.dg/template/crash13.C: Likewise.
2011-12-28 Michael Meissner <meissner@linux.vnet.ibm.com> 2011-12-28 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/51623 PR target/51623
......
...@@ -15,4 +15,4 @@ template <typename T> struct C ...@@ -15,4 +15,4 @@ template <typename T> struct C
X::Y; // { dg-error "not a base type" } X::Y; // { dg-error "not a base type" }
}; };
C<void> c; // { dg-message "required" } C<void> c;
...@@ -24,7 +24,7 @@ class B { ...@@ -24,7 +24,7 @@ class B {
int main() { int main() {
B<char> objB; // { dg-message "required" } B<char> objB;
return 0; return 0;
} }
// PR c++/23211
// { dg-do compile }
template<class T>
struct foo
{
typedef int jtype;
struct bar
{
using typename foo<T>::jtype; // { dg-error "not a base type" }
using foo<T>::jtype; // { dg-error "not a base type" }
};
};
template <class T>
struct A : T
{
using T::i;
using typename T::type;
};
struct B1 {};
template <class T> struct B2 {};
template <class T>
struct C : B1, B2<T>
{
using B1::x; // { dg-error "no member" }
using B2<T>::y;
using typename B2<T>::type;
};
// PR c++/23211
// { dg-do compile }
struct A { int x; };
template <class T>
struct B: A
{
using T::x;
};
B<A> b;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment