re PR c++/38908 (Unexplained "'<anonymous>' is used uninitialized in this function" warning in cc1plus -m64)
PR c++/38908 * class.c (is_really_empty_class): New fn. * cp-tree.h: Declare it. * cp-objcp-common.c (cp_expr_size): Use it. From-SVN: r144643
This commit is contained in:
parent
ee0ee7e2c1
commit
2588c9e970
|
@ -1,5 +1,10 @@
|
|||
2009-03-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/38908
|
||||
* class.c (is_really_empty_class): New fn.
|
||||
* cp-tree.h: Declare it.
|
||||
* cp-objcp-common.c (cp_expr_size): Use it.
|
||||
|
||||
PR c++/13549
|
||||
* semantics.c (perform_koenig_lookup): Handle TEMPLATE_ID_EXPR.
|
||||
* parser.c (cp_parser_postfix_expression): Call it for
|
||||
|
|
|
@ -6461,7 +6461,7 @@ is_empty_class (tree type)
|
|||
if (type == error_mark_node)
|
||||
return 0;
|
||||
|
||||
if (! MAYBE_CLASS_TYPE_P (type))
|
||||
if (! CLASS_TYPE_P (type))
|
||||
return 0;
|
||||
|
||||
/* In G++ 3.2, whether or not a class was empty was determined by
|
||||
|
@ -6501,6 +6501,37 @@ contains_empty_class_p (tree type)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Returns true if TYPE contains no actual data, just various
|
||||
possible combinations of empty classes. */
|
||||
|
||||
bool
|
||||
is_really_empty_class (tree type)
|
||||
{
|
||||
if (is_empty_class (type))
|
||||
return true;
|
||||
if (CLASS_TYPE_P (type))
|
||||
{
|
||||
tree field;
|
||||
tree binfo;
|
||||
tree base_binfo;
|
||||
int i;
|
||||
|
||||
for (binfo = TYPE_BINFO (type), i = 0;
|
||||
BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
|
||||
if (!is_really_empty_class (BINFO_TYPE (base_binfo)))
|
||||
return false;
|
||||
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
|
||||
if (TREE_CODE (field) == FIELD_DECL
|
||||
&& !DECL_ARTIFICIAL (field)
|
||||
&& !is_really_empty_class (TREE_TYPE (field)))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
else if (TREE_CODE (type) == ARRAY_TYPE)
|
||||
return is_really_empty_class (TREE_TYPE (type));
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Note that NAME was looked up while the current class was being
|
||||
defined and that the result of that lookup was DECL. */
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@ cp_expr_size (const_tree exp)
|
|||
constructed, this is a valid transformation. */
|
||||
|| CP_AGGREGATE_TYPE_P (type))
|
||||
/* This would be wrong for a type with virtual bases. */
|
||||
return (is_empty_class (type)
|
||||
return (is_really_empty_class (type)
|
||||
? size_zero_node
|
||||
: CLASSTYPE_SIZE_UNIT (type));
|
||||
else
|
||||
|
|
|
@ -4240,6 +4240,7 @@ extern void finish_struct_1 (tree);
|
|||
extern int resolves_to_fixed_type_p (tree, int *);
|
||||
extern void init_class_processing (void);
|
||||
extern int is_empty_class (tree);
|
||||
extern bool is_really_empty_class (tree);
|
||||
extern void pushclass (tree);
|
||||
extern void popclass (void);
|
||||
extern void push_nested_class (tree);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2009-03-05 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/38908
|
||||
* g++.dg/warn/Wuninitialized-3.C: New test.
|
||||
|
||||
2009-03-05 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR debug/39379
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// PR C++/38908
|
||||
// { dg-options "-Wuninitialized -O" }
|
||||
|
||||
struct empty {};
|
||||
|
||||
struct dfs_visitor {
|
||||
dfs_visitor() { }
|
||||
empty m_vis;
|
||||
};
|
||||
|
||||
void bar(const dfs_visitor&);
|
||||
void foo(void)
|
||||
{
|
||||
dfs_visitor vis;
|
||||
dfs_visitor vis2 = vis;
|
||||
bar (vis2);
|
||||
}
|
Loading…
Reference in New Issue