[cfe-dev] clang rejects nested struct-member-access-typeof
Csaba Raduly
rcsaba at gmail.com
Wed Nov 2 01:52:48 PDT 2011
Hi,
On Wed, Nov 2, 2011 at 1:50 AM, 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.
Comeau C++ didn't accept it either:
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 4: error: expected a type specifier
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: expected a ")"
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: explicit type is missing ("int" assumed)
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: expected a declaration
Wild guess: Should this be in a function block?
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: reference to local variable of
enclosing function is
not allowed
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: expected a ";" (perhaps on the previous
statement)
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: warning: missing return statement at end of non-void
function "<unnamed>::typeof"
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: type definition is not allowed
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: expected an expression
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: identifier "typeof" is undefined
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
"ComeauTest.c", line 4: error: expected a ";" (perhaps on the previous
statement)
typeof((struct { typeof((struct { void *m; }){p}.m) n; }){0}.n) q = 0;
^
10 errors detected in the compilation of "ComeauTest.c".
--
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds
More information about the cfe-dev
mailing list