[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