mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-11 00:39:46 +08:00
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
This commit is contained in:
parent
37f3b6804e
commit
1e9f58189c
@ -1,3 +1,14 @@
|
||||
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>
|
||||
|
||||
PR c++/51507
|
||||
|
@ -3217,7 +3217,7 @@ do_class_using_decl (tree scope, tree name)
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
scope_dependent_p = dependent_type_p (scope);
|
||||
scope_dependent_p = dependent_scope_p (scope);
|
||||
name_dependent_p = (scope_dependent_p
|
||||
|| (IDENTIFIER_TYPENAME_P (name)
|
||||
&& dependent_type_p (TREE_TYPE (name))));
|
||||
@ -3242,9 +3242,9 @@ do_class_using_decl (tree scope, tree name)
|
||||
|
||||
In general, we cannot check this constraint in a template because
|
||||
we do not know the entire set of base classes of the current
|
||||
class type. However, if all of the base classes are
|
||||
non-dependent, then we can avoid delaying the check until
|
||||
instantiation. */
|
||||
class type. Morover, if SCOPE is dependent, it might match a
|
||||
non-dependent base. */
|
||||
|
||||
if (!scope_dependent_p)
|
||||
{
|
||||
base_kind b_kind;
|
||||
@ -3270,7 +3270,7 @@ do_class_using_decl (tree scope, tree name)
|
||||
if (BASELINK_P (decl))
|
||||
decl = BASELINK_FUNCTIONS (decl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
value = build_lang_decl (USING_DECL, name, NULL_TREE);
|
||||
USING_DECL_DECLS (value) = decl;
|
||||
|
@ -14971,12 +14971,12 @@ cp_parser_using_declaration (cp_parser* parser,
|
||||
/* Create the USING_DECL. */
|
||||
decl = do_class_using_decl (parser->scope, identifier);
|
||||
|
||||
if (typename_p)
|
||||
if (decl && typename_p)
|
||||
USING_DECL_TYPENAME_P (decl) = 1;
|
||||
|
||||
if (check_for_bare_parameter_packs (decl))
|
||||
return false;
|
||||
else
|
||||
else
|
||||
/* Add it to the list of members in this class. */
|
||||
finish_member_declaration (decl);
|
||||
}
|
||||
|
@ -1,3 +1,11 @@
|
||||
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>
|
||||
|
||||
PR target/51623
|
||||
|
@ -15,4 +15,4 @@ template <typename T> struct C
|
||||
X::Y; // { dg-error "not a base type" }
|
||||
};
|
||||
|
||||
C<void> c; // { dg-message "required" }
|
||||
C<void> c;
|
||||
|
@ -24,7 +24,7 @@ class B {
|
||||
|
||||
|
||||
int main() {
|
||||
B<char> objB; // { dg-message "required" }
|
||||
B<char> objB;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
31
gcc/testsuite/g++.dg/template/using18.C
Normal file
31
gcc/testsuite/g++.dg/template/using18.C
Normal file
@ -0,0 +1,31 @@
|
||||
// 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;
|
||||
};
|
12
gcc/testsuite/g++.dg/template/using19.C
Normal file
12
gcc/testsuite/g++.dg/template/using19.C
Normal file
@ -0,0 +1,12 @@
|
||||
// PR c++/23211
|
||||
// { dg-do compile }
|
||||
|
||||
struct A { int x; };
|
||||
|
||||
template <class T>
|
||||
struct B: A
|
||||
{
|
||||
using T::x;
|
||||
};
|
||||
|
||||
B<A> b;
|
Loading…
Reference in New Issue
Block a user