re PR c++/33460 (ICE with static member in anonymous union)
cp/ 2007-09-20 Paolo Carlini <pcarlini@suse.de> PR c++/33460 * semantics.c (finish_id_expression): Use consistently context_for_name_lookup. * decl.c (fixup_anonymous_aggr): Fix error message for anonymous struct (vs union). testsuite/ 2007-09-20 Paolo Carlini <pcarlini@suse.de> PR c++/33460 * g++.dg/ext/anon-struct6.C: New. From-SVN: r128637
This commit is contained in:
parent
fe046210e2
commit
24f58e7497
@ -1,3 +1,11 @@
|
||||
2007-09-20 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR c++/33460
|
||||
* semantics.c (finish_id_expression): Use consistently
|
||||
context_for_name_lookup.
|
||||
* decl.c (fixup_anonymous_aggr): Fix error message for
|
||||
anonymous struct (vs union).
|
||||
|
||||
2007-09-19 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/7586
|
||||
|
@ -3704,8 +3704,14 @@ fixup_anonymous_aggr (tree t)
|
||||
|
||||
/* ISO C++ 9.5.3. Anonymous unions may not have function members. */
|
||||
if (TYPE_METHODS (t))
|
||||
error ("%Jan anonymous union cannot have function members",
|
||||
TYPE_MAIN_DECL (t));
|
||||
{
|
||||
tree decl = TYPE_MAIN_DECL (t);
|
||||
|
||||
if (TREE_CODE (t) != UNION_TYPE)
|
||||
error ("%Jan anonymous struct cannot have function members", decl);
|
||||
else
|
||||
error ("%Jan anonymous union cannot have function members", decl);
|
||||
}
|
||||
|
||||
/* Anonymous aggregates cannot have fields with ctors, dtors or complex
|
||||
assignment operators (because they cannot have these methods themselves).
|
||||
|
@ -2926,13 +2926,15 @@ finish_id_expression (tree id_expression,
|
||||
else
|
||||
{
|
||||
if (DECL_P (decl) && DECL_NONLOCAL (decl)
|
||||
&& DECL_CLASS_SCOPE_P (decl)
|
||||
&& context_for_name_lookup (decl) != current_class_type)
|
||||
&& DECL_CLASS_SCOPE_P (decl))
|
||||
{
|
||||
tree path;
|
||||
|
||||
path = currently_open_derived_class (DECL_CONTEXT (decl));
|
||||
perform_or_defer_access_check (TYPE_BINFO (path), decl, decl);
|
||||
tree context = context_for_name_lookup (decl);
|
||||
if (context != current_class_type)
|
||||
{
|
||||
tree path = currently_open_derived_class (context);
|
||||
perform_or_defer_access_check (TYPE_BINFO (path),
|
||||
decl, decl);
|
||||
}
|
||||
}
|
||||
|
||||
decl = convert_from_reference (decl);
|
||||
|
@ -1,3 +1,8 @@
|
||||
2007-09-20 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR c++/33460
|
||||
* g++.dg/ext/anon-struct6.C: New.
|
||||
|
||||
2007-09-21 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||
|
||||
PR libfortran/23272
|
||||
|
10
gcc/testsuite/g++.dg/ext/anon-struct6.C
Normal file
10
gcc/testsuite/g++.dg/ext/anon-struct6.C
Normal file
@ -0,0 +1,10 @@
|
||||
// PR c++/33460
|
||||
|
||||
struct A
|
||||
{
|
||||
struct
|
||||
{ // { dg-error "anonymous struct cannot have function members" }
|
||||
struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members" }
|
||||
void foo() { i; }
|
||||
}; // { dg-error "prohibits anonymous structs" }
|
||||
};
|
Loading…
Reference in New Issue
Block a user