Consider this C code:
#include <stdio.h>
typedef long long int int64;
typedef long long unsigned int uint64;
struct pointer {
uint64 data : 58;
uint64 tag : 6;
};
union value {
int64 i;
struct pointer p;
};
typedef union value Value;
void test(Value x) {
printf("%llu\n", x.p.data);
}
When I compile it with -Wall, I get
foo.c:20: warning: format %llu expects type long long unsigned int, but
argument 2 has type long long unsigned int:58
The value is presumably going to be passed to printf as an unsigned long
long--what else could it be passed as? So this warning seems incorrect.
This may be related to PR 33819.
--
Summary: Bad printf warning for bitfield
Product: gcc
Version: 4.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: ian at airs dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33873