lmi
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lmi] [PATCH] Use "noreturn" attribute in the function declaration t


From: Greg Chicares
Subject: Re: [lmi] [PATCH] Use "noreturn" attribute in the function declaration too
Date: Wed, 15 Mar 2017 09:24:01 +0000
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.6.0

On 2017-03-15 00:12, Vadim Zeitlin wrote:
> 
>  As previously mentioned, my reading of the Standard seems to indicate that
> not using the "noreturn" attribute in the function declaration, but using
> it in the function definition makes the program ill-formed. Whether I'm
> correct or not, it definitely makes it uncompilable with MSVC which gives
> many errors similar to the following one:

[split into several lines]

> any_member.hpp(572): error C2381: \
  'MemberSymbolTable<ClassType>::complain_that_no_such_member_is_ascribed': 
redefinition; \
  '__declspec(noreturn)' or '[[noreturn]]' differs (compiling source file 
gpt_input.cpp)
> 
>  The attached patch simply adds "[[noreturn]]" to the function declaration,
> which seems like the right fix to me. Could you please apply it?

Please try my commit 082dd93 instead and let me know whether it works
(once I push it; I want to consider your other, later patch first).

I agree that it was wrong to write [[noreturn]] on the definition but
not on the declaration. Your message cites 7.6.3/1 [dcl.attr.noreturn]:

| The attribute may be applied to the declarator-id in a function
| declaration. The first declaration of a function shall specify the
| noreturn attribute if any declaration of that function specifies the
| noreturn attribute.

and in this example the "first declaration" did not specify [[noreturn]].

However, your patch seems to suggest that, following a declaration that
specifies [[noreturn]], the definition of the same function may specify
it too. Reading between the lines of the standard, I think it's allowed
only on declarations. I.e., I think the word "may" in the first sentence
quoted above is exclusive: the standard doesn't grant permission for this
attribute to be used in any other situation than a function declaration.

This example seems to suggest that [[noreturn]] can be omitted from
the definition:

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/noreturnfinal_xml.html
| void fatal(void) [[noreturn]];
| void fatal(...)
| {
| ...
|         exit(1);
| }

and I'm reminded of experience with various msw compilers that allow
__declspec__ only on a declaration but forbid it on a definition that
is not a defining-declaration; that's my main reason for hesitating
to write it anywhere but on the first declaration.

cppreference.com seems to suggest something similar:

http://en.cppreference.com/w/cpp/language/attributes
| [[noreturn]]
| This attribute applies to function declarations only.

But of course any function definition is a declaration, and that
article cites no authoritative source, so unfortunately we're
reduced to guesswork.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]