Created attachment 29687 [details] the preprocessed file for r.c $:cat r.c ------------------------------------------------------ #include<stdio.h> #include<stdlib.h> int *c; c = (int *)malloc(sizeof(int)); int main(void) { return 0; } error or warning ------------------------------------------------------- r.c:4:1: warning: data definition has no type or storage class [enabled by default] r.c:4:1: error: conflicting types for ‘c’ r.c:3:6: note: previous declaration of ‘c’ was here r.c:4:5: warning: initialization makes integer from pointer without a cast [enabled by default] r.c:4:1: error: initializer element is not constant $: gcc -v -save-temps r.c ------------------------------------------------------- Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-2ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu r.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector -o r.i ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/4.7/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -fpreprocessed r.i -quiet -dumpbase r.c -mtune=generic -march=x86-64 -auxbase r -version -fstack-protector -o r.s GNU C (Ubuntu/Linaro 4.7.2-2ubuntu1) version 4.7.2 (x86_64-linux-gnu) compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU C (Ubuntu/Linaro 4.7.2-2ubuntu1) version 4.7.2 (x86_64-linux-gnu) compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: efa32fef7aa241fa03ac6d7ad2a4a2cf r.c:4:1: warning: data definition has no type or storage class [enabled by default] r.c:4:1: error: conflicting types for ‘c’ r.c:3:6: note: previous declaration of ‘c’ was here r.c:4:5: warning: initialization makes integer from pointer without a cast [enabled by default] r.c:4:1: error: initializer element is not constant
The diagnostic seems correct for me.
I think maybe only this one is right: r.c:4:1: error: initializer element is not constant the other part may cause little confused.
(In reply to comment #0) > ------------------------------------------------------- > r.c:4:1: warning: data definition has no type or storage class [enabled by > default] > r.c:4:1: error: conflicting types for ‘c’ > r.c:3:6: note: previous declaration of ‘c’ was here > r.c:4:5: warning: initialization makes integer from pointer without a cast > [enabled by default] > r.c:4:1: error: initializer element is not constant > Since this is at the top level, only definitions are allowed which is what GCC is assuming. GCC has an extension of not needing a type or storage class for some variable and assume int as the type. That comes to the second error message of the conflicting types. The next warning is due to the int of c now being int from the extension. And the last error message is saying the initializer element is not constant as this is the top level. That explains exactly what is going on and why GCC's warnings/error messages are correct. The trunk gives: t1.c:4:1: warning: data definition has no type or storage class [enabled by default] c = (int *)malloc(sizeof(int)); ^ t1.c:4:1: error: conflicting types for ‘c’ t1.c:3:6: note: previous declaration of ‘c’ was here int *c; ^ t1.c:4:5: warning: initialization makes integer from pointer without a cast [enabled by default] c = (int *)malloc(sizeof(int)); ^ t1.c:4:1: error: initializer element is not constant c = (int *)malloc(sizeof(int)); ^ Which should better explain what is going on here.
Thank you.It's clear after your clarifying patiently
.