Bug 56647 - use return value of malloc() as initializer
Summary: use return value of malloc() as initializer
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 4.7.2
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-03-18 05:28 UTC by shia
Modified: 2013-03-18 09:38 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
the preprocessed file for r.c (6.17 KB, application/octet-stream)
2013-03-18 05:28 UTC, shia
Details

Note You need to log in before you can comment on or make changes to this bug.
Description shia 2013-03-18 05:28:46 UTC
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
Comment 1 Andrew Pinski 2013-03-18 05:48:41 UTC
The diagnostic seems correct for me.
Comment 2 shia 2013-03-18 05:54:54 UTC
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.
Comment 3 Andrew Pinski 2013-03-18 06:11:55 UTC
(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.
Comment 4 shia 2013-03-18 06:34:54 UTC
Thank you.It's clear after your clarifying patiently
Comment 5 Jonathan Wakely 2013-03-18 09:38:41 UTC
.