[cfe-commits] [LLVMdev] clang errors on void main()

John McCall rjmccall at apple.com
Fri Feb 10 14:31:48 PST 2012


On Feb 10, 2012, at 1:27 PM, Vasiliy Korchagin wrote:
> On 11.02.2012 00:16, David Blaikie wrote:
>> 2012/2/10 Vasiliy Korchagin<korchagin at ispras.ru>:
>>> On 10.02.2012 19:45, David Blaikie wrote:
>>>> 2012/2/9 Vasiliy Korchagin<korchagin at ispras.ru>:
>>>>> On 08.02.2012 23:47, David Blaikie wrote:
>>>>> 
>>>>> On Wed, Feb 8, 2012 at 11:25 AM, Chris Lattner<clattner at apple.com>
>>>>>  wrote:
>>>>> 
>>>>> On Feb 8, 2012, at 5:31 AM, Vasiliy Korchagin wrote:
>>>>> 
>>>>> 07.02.2012 07:27, Eli Friedman пишет:
>>>>> 
>>>>> On Mon, Feb 6, 2012 at 6:51 PM, Xin Tong<xerox.time.tech at gmail.com>
>>>>>  wrote:
>>>>> 
>>>>> Is there any way to stop this ?
>>>>> 
>>>>> /home/socrates/llvm/llvm-3.0.src/benchmarks/powerstone/crc/crc.c:67:1:
>>>>> error: 'main' must return 'int'
>>>>> void main()
>>>>> ^
>>>>> 1 error generated.
>>>>> 
>>>>> You mean besides fixing the source of your benchmark so it's valid C?
>>>>> Not at the moment... patches welcome.
>>>>> 
>>>>> -Eli
>>>>> 
>>>>> We suggest patch for allowing main() function to have non-integer return
>>>>> type. This feature can be enabled with "-allow-non-int-main" option. In
>>>>> this
>>>>> case warning about incorrect main() return type will be printed instead
>>>>> of
>>>>> error.
>>>>> 
>>>>> In patch also included test case for this feature.
>>>>> 
>>>>> Vasiliy Korchagin,
>>>>> 
>>>>> Hi Vasiliy,
>>>>> 
>>>>> Please send clang patches to cfe-dev.
>>>>> 
>>>>> or even cfe-commits (further instructions are here:
>>>>> http://clang.llvm.org/get_involved.html)
>>>>> 
>>>>> [I've dropped llvm-dev and added cfe-commits to this email]
>>>>> 
>>>>> My first thought based on your description alone would be that we
>>>>> should support this, if at all, probably in the way that GCC already
>>>>> does - surfacing non-int returning main as a warning in C (under
>>>>> -Wmain) and error in C++ (as it is already) if that's practical.
>>>>> 
>>>>> &    looking at the patch itself: Your change is even more permissive
>>>>> than GCC (when you use the flag you've added) allowing C++ to have
>>>>> void returning main. I don't see any need to be so accepting.
>>>>> 
>>>>> (&    the change you've made in Sema::ActOnFinishFunctionBody scares me a
>>>>> bit - what does that do when you have int returning main but you turn
>>>>> this flag on? not allow implicit return 0? that seems problematic)
>>>>> 
>>>>> - David
>>>>> 
>>>>> David, thanks for your reply.
>>>>> 
>>>>> Seems like my response missed mailing list, so I'm sending it again.
>>>>> I changed the patch and now "-allow-non-int-main" option allows to print
>>>>> a warning in C and error in C++ in case of non-integer main. I also
>>>>> fixed implicit returning 0.
>>>> Sorry, I just didn't get around to replying - I still think this
>>>> should be under the -Wmain flag, probably - like it is in GCC. But I
>>>> could be wrong - hopefully someone else pipes up with an opinion too.
>>>> 
>>>> (it's possible it should be stronger - perhaps a separate warning that
>>>> defaults to error - but I don't think it should be an entirely
>>>> new/separate flag)
>>>> 
>>>> - David
>>> I reduced patch and now it provides GCC-like behavior. In C clang prints a
>>> warning and in C++ prints error. The warning is under control of -Wmain
>>> flag.
>> This looks better - though do you need the change in codegen? what
>> happens if you remove that (leave it as it was before)?&  some test
>> cases would be good.
>> 
>> I'm still a bit concerned about relaxing the default behavior too much
>> - hopefully other Clang developers will chime in with a more informed
>> opinion on this, but perhaps we'll want to group this particular
>> warning under its own flag (main-return-type ?)&  make that diagnostic
>> an error by default (this is a weird device to use&  it turns up in a
>> few other places in Clang, but it might be an appropriate fit here).
> According to C99 5.1.2.2.3 Clang allows main() to implicitly return 0. ReturnValue variable in CodeGenFunction should not be null to hold the return value. If changes in codegen are removed Clang crashes trying to create implicit return.

The appropriate fix here is for Sema to not set the hasImplicitReturnZero() bit.

John.



More information about the cfe-commits mailing list