class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for an bit-field whose width exceeds that of its...

* class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for
	an bit-field whose width exceeds that of its type.

	* g++.dg/abi/bitfield11.C: New test.
	* g++.dg/abi/bitfield12.C: Likewise.

From-SVN: r71392
This commit is contained in:
Mark Mitchell 2003-09-15 00:27:16 +00:00 committed by Mark Mitchell
parent bd12da498d
commit 29edb15c56
4 changed files with 33 additions and 1 deletions

View File

@ -4759,7 +4759,15 @@ layout_class_type (tree t, tree *virtuals_p)
field to the size of its declared type; the rest of the
field is effectively invisible. */
DECL_SIZE (field) = TYPE_SIZE (type);
DECL_MODE (field) = TYPE_MODE (type);
/* We must also reset the DECL_MODE of the field. */
if (abi_version_at_least (2))
DECL_MODE (field) = TYPE_MODE (type);
else if (warn_abi
&& DECL_MODE (field) != TYPE_MODE (type))
/* Versions of G++ before G++ 3.4 did not reset the
DECL_MODE. */
warning ("the offset of `%D' may not be ABI-compliant and may "
"change in a future version of GCC", field);
}
else
layout_nonempty_base_or_field (rli, field, NULL_TREE,

View File

@ -1,3 +1,8 @@
2003-09-14 Mark Mitchell <mark@codesourcery.com>
* g++.dg/abi/bitfield11.C: New test.
* g++.dg/abi/bitfield12.C: Likewise.
2003-09-14 Alexandre Oliva <aoliva@redhat.com>
* gcc.dg/cpp/separate-1.c: Adjust line of error. Test for correct

View File

@ -0,0 +1,14 @@
// { dg-do run }
// { dg-options "-w -fabi-version=0" }
struct S {
char c : 1024;
};
S s;
int main () {
s.c = 1;
if (*(char *)&s != 1)
return 1;
}

View File

@ -0,0 +1,5 @@
// { dg-options "-Wabi -fabi-version=1" }
struct S { // { dg-warning "ABI" }
char c : 1024; // { dg-warning "width" }
};