[cfe-dev] clang rejects nested struct-member-access-typeof
Douglas Gregor
dgregor at apple.com
Tue Nov 1 20:51:55 PDT 2011
On Nov 1, 2011, at 5:50 PM, Jan Engelhardt wrote:
>
>
> == Compiler info (clang -v) ==
>
> [openSUSE 12.1 RC]
> SUSE Linux clang version 3.0 (trunk 140782) (based on LLVM 3.0)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
>
> == Source ==
>
> int main(void)
> {
> void *p = 0;
> typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
> return 0;
> }
>
> == Description ==
>
> I was giving clang a spin on libHX [http://libhx.sf.net/] when it errored out
> on libHX's "type-checking casts" macros. The above source snippet is the
> distilled minimal test case.
>
> ../../src/format.c:34:29: error: initializer element is not a compile-time
> constant
> return const_cast1(void *, static_cast(const void *, t));
> ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> [...]
>
>
>
> == Observed output ==
>
> $ clang test.c
> t.c:4:47: error: initializer element is not a compile-time constant
> typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
> ^~~
> t.c:4:63: error: member reference base type 'void' is not a structure or union
> typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
> ~~~ ^
> 2 errors generated.
>
>
> == Expected output ==
>
> That no errors be output. GCC 4.5/4.6/4.x compiles the very same file
> fine, because it sees that we are really only doing type inspection.
This code is relying on GCC extensions to treat a compound literal as a constant expression, which C99 forbids. Feel free to file a bug; this might be the kind of thing that we can support for GNU compatibility, if it falls out of the constexpr and other C++11 work in this area.
- Doug
More information about the cfe-dev
mailing list