Sorry -- with the obvious error fixed:
$ /usr/bin/clang-4.0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -Wno-unused-command-line-argument -Wall -c clang-bug.c clang-bug.c:55:9: warning: taking address of packed member 'ip_blkid' of class or structure 'ItemPointerData' may result in an unaligned pointer value [-Waddress-of-packed-member] return ItemPointerGetBlockNumber(&ip); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clang-bug.c:49:25: note: expanded from macro 'ItemPointerGetBlockNumber' BlockIdGetBlockNumber(&(pointer)->ip_blkid) \ ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ clang-bug.c:39:19: note: expanded from macro 'BlockIdGetBlockNumber' (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) \ ^~~~~~~ clang-bug.c:55:9: warning: taking address of packed member 'ip_blkid' of class or structure 'ItemPointerData' may result in an unaligned pointer value [-Waddress-of-packed-member] return ItemPointerGetBlockNumber(&ip); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clang-bug.c:49:25: note: expanded from macro 'ItemPointerGetBlockNumber' BlockIdGetBlockNumber(&(pointer)->ip_blkid) \ ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ clang-bug.c:39:55: note: expanded from macro 'BlockIdGetBlockNumber' (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) \ ^~~~~~~ 2 warnings generated.
#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) #define pg_attribute_aligned(a) __attribute__((aligned(a))) #define pg_attribute_packed() __attribute__((packed)) #endif typedef unsigned BlockNumber; typedef unsigned short uint16; typedef uint16 OffsetNumber; typedef struct BlockIdData { uint16 bi_hi; uint16 bi_lo; } BlockIdData; typedef struct ItemPointerData { BlockIdData ip_blkid; OffsetNumber ip_posid; } /* If compiler understands packed and aligned pragmas, use those */ #if defined(pg_attribute_packed) && defined(pg_attribute_aligned) pg_attribute_packed() pg_attribute_aligned(2) #endif ItemPointerData; typedef ItemPointerData *ItemPointer; /* * BlockIdGetBlockNumber * Retrieve the block number from a block identifier. */ #define BlockIdGetBlockNumber(blockId) \ ( \ (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) \ ) /* * ItemPointerGetBlockNumber * Returns the block number of a disk item pointer. */ #define ItemPointerGetBlockNumber(pointer) \ ( \ BlockIdGetBlockNumber(&(pointer)->ip_blkid) \ ) int main() { ItemPointerData ip; return ItemPointerGetBlockNumber(&ip); }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers