[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] stdnoreturn: new module
From: |
Bruno Haible |
Subject: |
Re: [PATCH] stdnoreturn: new module |
Date: |
Wed, 29 Feb 2012 01:01:16 +0100 |
User-agent: |
KMail/4.7.4 (Linux/3.1.0-1.2-desktop; KDE/4.7.4; x86_64; ; ) |
Hi Paul,
> > The current set of definitions
> >
> > #define _Noreturn __declspec (noreturn)
> > #define noreturn _Noreturn
> >
> > leads to a syntax error when someone writes __declspec (noreturn),
> > because preprocessing transforms it to __declspec (__declspec (noreturn)).
> >
> > How can this syntax error be avoided?
>
> I don't see any reasonable way to do it.
If we could redefine __declspec, it would be possible. Like this:
$ cat foo.c
#define noreturn __declspec(noreturn)
#define _Noreturn noreturn
#define __declspec(a) __declspec1(a)
#define __declspec1(a) __wrapped_##a
#define __wrapped_noreturn __declspec(noreturn1)
#define __wrapped_noreturn1 __declspec(noreturn)
#define __wrapped___wrapped_noreturn __declspec1(noreturn2)
#define __wrapped_noreturn2 noreturn
__declspec(noreturn) void exit (int);
noreturn void exit (int);
$ cl -E foo.c
...
__declspec(noreturn) void exit (int);
__declspec(noreturn) void exit (int);
But unfortunately there are also other possible elements in a declspec
list, see [1]. I don't see how to accommodate these.
And interestingly, this preprocessor output from 'cl' is different
from the one that gcc produces. With gcc, it's easier:
$ cat foo.c
#define noreturn __declspec(noreturn)
#define _Noreturn noreturn
#define __declspec(a) __wrapped_##a
#define __wrapped_noreturn __attribute__((__noreturn__))
__declspec(noreturn) void exit (int);
noreturn void exit (int);
$ gcc -E foo.c
...
__attribute__((__noreturn__)) void exit (int);
__attribute__((__noreturn__)) void exit (int);
Bruno
[1] http://msdn.microsoft.com/en-us/library/dabb5z75%28v=vs.80%29.aspx
- [PATCH] stdnoreturn: new module, Paul Eggert, 2012/02/24
- Re: [PATCH] stdnoreturn: new module, Bruno Haible, 2012/02/27
- Re: [PATCH] stdnoreturn: new module,
Bruno Haible <=
- Re: [PATCH] stdnoreturn: new module, Paul Eggert, 2012/02/28
- Re: [PATCH] stdnoreturn: new module, Eric Blake, 2012/02/28
- Re: [PATCH] stdnoreturn: new module, Bruno Haible, 2012/02/28
- Re: [PATCH] stdnoreturn: new module, Paul Eggert, 2012/02/29