From: "Robert P. J. Day" <rpjday@mindspring.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] MIPS: Transform old-style macros to newer "__noreturn" standard.
Date: Sat, 26 May 2007 09:33:40 -0400 (EDT) [thread overview]
Message-ID: <Pine.LNX.4.64.0705260924370.19438@localhost.localdomain> (raw)
In-Reply-To: <46573B23.1090700@zytor.com>
On Fri, 25 May 2007, H. Peter Anvin wrote:
> Robert P. J. Day wrote:
> >
> >
> > f() __attribute__((noreturn)) ;
> >
> > you get:
> >
> > warning: data definition has no type or storage class
> >
> > but gcc doesn't complain if you declare it thusly:
> >
> > __attribute__((noreturn)) f() ;
> >
> > that strikes me as a flaw in gcc, no?
> >
>
> Doesn't matter. gcc accepts "void __attribute__((noreturn)) f();", and
> thus, one can define:
>
> #define __noreturn void __attribute__((noreturn))
>
> ... and declare functions as:
>
> __noreturn f();
>
> ... which is the syntactially sane way of doing it.
i've thought about this and, while i philosophically agree with you,
i'm not going down that road for a couple reasons.
first, there is the fact that there is already a macro definition for
__noreturn in include/linux/compiler-gcc.h:
#define __noreturn __attribute__((noreturn))
second, and more importantly, defining __noreturn as you suggest is
now mixing two fundamental pieces of information. "void" is a return
type, plain and simple. an attribute, OTOH, as i read it, is more of
a suggestion to the compiler to allow better checking of your code
and, based on future compilers, it may not even be meaningful.
all of the short forms for attributes defined in compiler-gcc.h are
exactly that -- short forms. by adding in a return type, you're
fundamentally changing the way that short cut can be used.
yes, i *know* that __noreturn makes the return type irrelevant. but
even the gcc manual doesn't try to take that extra step:
================================================================
A few standard library functions, such as abort and exit, cannot
return. GCC knows this automatically. Some programs define their own
functions that never return. You can declare them noreturn to tell the
compiler this fact. For example,
void fatal () __attribute__ ((noreturn));
void
fatal (...)
{
... /* Print error message. */ ...
exit (1);
}
The noreturn keyword tells the compiler to assume that fatal cannot
return. It can then optimize without regard to what would happen if
fatal ever did return. This makes slightly better code. More
importantly, it helps avoid spurious warnings of uninitialized
variables.
Do not assume that registers saved by the calling function are
restored before calling the noreturn function.
It does not make sense for a noreturn function to have a return type
other than void.
^^^^^ ^^^^ ^^^^
===============================================================
so I'm just going to stick with the pattern that's been used so far.
i realize it offends your sense of syntactic sensibility, but it's
just not worth treating that one attribute so differently from the
rest of them.
rday
--
========================================================================
Robert P. J. Day
Linux Consulting, Training and Annoying Kernel Pedantry
Waterloo, Ontario, CANADA
http://fsdev.net/wiki/index.php?title=Main_Page
========================================================================
next prev parent reply other threads:[~2007-05-26 13:35 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-25 18:32 Robert P. J. Day
2007-05-25 18:40 ` H. Peter Anvin
2007-05-25 19:04 ` Robert P. J. Day
2007-05-25 19:38 ` H. Peter Anvin
2007-05-25 21:10 ` Robert P. J. Day
2007-05-25 21:43 ` H. Peter Anvin
2007-05-25 22:16 ` Satyam Sharma
2007-05-25 22:25 ` H. Peter Anvin
2007-05-25 22:35 ` Satyam Sharma
2007-05-25 22:46 ` H. Peter Anvin
2007-05-25 22:56 ` Satyam Sharma
2007-05-26 13:33 ` Robert P. J. Day [this message]
2007-05-26 18:10 ` H. Peter Anvin
2007-05-26 23:29 ` H. Peter Anvin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.64.0705260924370.19438@localhost.localdomain \
--to=rpjday@mindspring.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®