Ah. Here we go: $ /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:54:9: error: use of undeclared identifier 'BlockNumber' return ItemPointerGetBlockNumber(&ip); ^ clang-bug.c:48:2: note: expanded from macro 'ItemPointerGetBlockNumber' BlockIdGetBlockNumber(&(pointer)->ip_blkid) \ ^ clang-bug.c:38:3: note: expanded from macro 'BlockIdGetBlockNumber' (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) \ ^ 1 error generated.
Preprocessor output: # 1 "clang-bug.c" # 1 "<built-in>" 1 # 1 "<built-in>" 3 # 317 "<built-in>" 3 # 1 "<command line>" 1 # 1 "<built-in>" 2 # 1 "clang-bug.c" 2 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; } __attribute__((packed)) __attribute__((aligned(2))) ItemPointerData; typedef ItemPointerData *ItemPointer; # 51 "clang-bug.c" int main() { ItemPointerData ip; return ( ( (BlockNumber) (((&(&ip)->ip_blkid)->bi_hi << 16) | ((uint16) (&(&ip)->ip_blkid)->bi_lo)) ) ); }
#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 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