[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