[cfe-dev] clang rejects nested struct-member-access-typeof

Jan Engelhardt jengelh at medozas.de
Tue Nov 1 17:50:08 PDT 2011



== 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.



More information about the cfe-dev mailing list