Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Jun 2015 11:42:16 -0500
From:      Pedro Giffuni <pfg@FreeBSD.org>
To:        Dimitry Andric <dim@FreeBSD.org>
Cc:        David Chisnall <theraven@FreeBSD.org>, src-committers@freebsd.org,  svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r268137 - head/sys/sys
Message-ID:  <55844668.60204@FreeBSD.org>
In-Reply-To: <D58BE060-870A-4D5E-AE46-D915D9CD6A0C@FreeBSD.org>
References:  <201407020845.s628jRG5031824@svn.freebsd.org> <5BE3492F-86A0-4CE3-A27C-8DB5EB662C64@FreeBSD.org> <55842F16.5040608@FreeBSD.org> <D58BE060-870A-4D5E-AE46-D915D9CD6A0C@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------090003010508000202020705
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit



On 06/19/15 11:24, Dimitry Andric wrote:
> On 19 Jun 2015, at 17:02, Pedro Giffuni <pfg@freebsd.org> wrote:
>>> On 19/06/2015 05:16 a.m., David Chisnall wrote:
>>>> I only just caught this (having seen the fallout from NetBSD doing the same thing in a shipping release and the pain that it’s caused):
>>>>
>>>> __weak is a reserved keyword in Objective-C, please pick another name for this.  This in cdefs.h makes it impossible to include any FreeBSD standard headers in Objective-C programs (of which we have a couple of hundred in ports) if they use any of the modern Objective-C language modes.
> ...
>> Closely related to this, we are redefining _Noreturn, which is a reserved keyword in C11.
> No, sys/cdefs.h has:
>
>     254  /*
>     255   * Keywords added in C11.
>     256   */
>     257
>     258  #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L || defined(lint)
> [...]
>     284  #if defined(__cplusplus) && __cplusplus >= 201103L
>     285  #define _Noreturn               [[noreturn]]
>     286  #else
>     287  #define _Noreturn               __dead2
>     288  #endif
> [...]
>     320  #endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */
>
> So the whole block redefining all the _Xxx identifiers is skipped for
> C11 and higher.

Oh yes, I had missed line 258 (and 320), sorry for the false alarm.

FWIW, there is still a minor issue: older compilers aren't supposed
to take __dead2 at the beginning. When i was discussing the
attached patch, bde suggested we should resurrect __dead.

Pedro.





> E.g.:
>
> $ cpp -std=c99
> #include <sys/cdefs.h>
> _Noreturn void foo(void);
> ^D
> # 1 "<stdin>"
> # 1 "<built-in>" 1
> # 1 "<built-in>" 3
> # 306 "<built-in>" 3
> # 1 "<command line>" 1
> # 1 "<built-in>" 2
> # 1 "<stdin>" 2
> # 1 "/usr/include/sys/cdefs.h" 1 3 4
> # 2 "<stdin>" 2
> __attribute__((__noreturn__)) void foo(void);
>
> $ cpp -std=c11
> #include <sys/cdefs.h>
> _Noreturn void foo(void);
> ^D
> # 1 "<stdin>"
> # 1 "<built-in>" 1
> # 1 "<built-in>" 3
> # 306 "<built-in>" 3
> # 1 "<command line>" 1
> # 1 "<built-in>" 2
> # 1 "<stdin>" 2
> # 1 "/usr/include/sys/cdefs.h" 1 3 4
> # 2 "<stdin>" 2
> _Noreturn void foo(void);
>
> -Dimitry
>


--------------090003010508000202020705
Content-Type: text/x-patch;
 name="include_Noreturn.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="include_Noreturn.diff"

Index: include/assert.h
===================================================================
--- include/assert.h	(revision 284138)
+++ include/assert.h	(working copy)
@@ -72,7 +72,7 @@
 #endif
 
 __BEGIN_DECLS
-void __assert(const char *, const char *, int, const char *) __dead2;
+_Noreturn void	__assert(const char *, const char *, int, const char *);
 __END_DECLS
 
 #endif /* !_ASSERT_H_ */
Index: include/err.h
===================================================================
--- include/err.h	(revision 284138)
+++ include/err.h	(working copy)
@@ -44,21 +44,20 @@
 #include <sys/_types.h>
 
 __BEGIN_DECLS
-void	err(int, const char *, ...) __dead2 __printf0like(2, 3);
-void	verr(int, const char *, __va_list) __dead2 __printf0like(2, 0);
-void	errc(int, int, const char *, ...) __dead2 __printf0like(3, 4);
-void	verrc(int, int, const char *, __va_list) __dead2
-	    __printf0like(3, 0);
-void	errx(int, const char *, ...) __dead2 __printf0like(2, 3);
-void	verrx(int, const char *, __va_list) __dead2 __printf0like(2, 0);
-void	warn(const char *, ...) __printf0like(1, 2);
-void	vwarn(const char *, __va_list) __printf0like(1, 0);
-void	warnc(int, const char *, ...) __printf0like(2, 3);
-void	vwarnc(int, const char *, __va_list) __printf0like(2, 0);
-void	warnx(const char *, ...) __printflike(1, 2);
-void	vwarnx(const char *, __va_list) __printflike(1, 0);
-void	err_set_file(void *);
-void	err_set_exit(void (*)(int));
+_Noreturn void	err(int, const char *, ...) __printf0like(2, 3);
+_Noreturn void	verr(int, const char *, __va_list) __printf0like(2, 0);
+_Noreturn void	errc(int, int, const char *, ...) __printf0like(3, 4);
+_Noreturn void	verrc(int, int, const char *, __va_list) __printf0like(3, 0);
+_Noreturn void	errx(int, const char *, ...) __printf0like(2, 3);
+_Noreturn void	verrx(int, const char *, __va_list) __printf0like(2, 0);
+void		warn(const char *, ...) __printf0like(1, 2);
+void		vwarn(const char *, __va_list) __printf0like(1, 0);
+void		warnc(int, const char *, ...) __printf0like(2, 3);
+void		vwarnc(int, const char *, __va_list) __printf0like(2, 0);
+void		warnx(const char *, ...) __printflike(1, 2);
+void		vwarnx(const char *, __va_list) __printflike(1, 0);
+void		err_set_file(void *);
+void		err_set_exit(void (*)(int));
 __END_DECLS
 
 #endif /* !_ERR_H_ */
Index: include/pthread.h
===================================================================
--- include/pthread.h	(revision 284138)
+++ include/pthread.h	(working copy)
@@ -199,7 +199,7 @@
 			void *(*) (void *), void *);
 int		pthread_detach(pthread_t);
 int		pthread_equal(pthread_t, pthread_t);
-void		pthread_exit(void *) __dead2;
+_Noreturn void	pthread_exit(void *);
 void		*pthread_getspecific(pthread_key_t);
 int		pthread_getcpuclockid(pthread_t, clockid_t *);
 int		pthread_join(pthread_t, void **);
Index: include/setjmp.h
===================================================================
--- include/setjmp.h	(revision 284138)
+++ include/setjmp.h	(working copy)
@@ -45,17 +45,17 @@
 
 __BEGIN_DECLS
 #if __BSD_VISIBLE || __XSI_VISIBLE >= 600
-void	_longjmp(jmp_buf, int) __dead2;
-int	_setjmp(jmp_buf) __returns_twice;
+_Noreturn void	_longjmp(jmp_buf, int);
+int		_setjmp(jmp_buf) __returns_twice;
 #endif
-void	longjmp(jmp_buf, int) __dead2;
+_Noreturn void	longjmp(jmp_buf, int);
 #if __BSD_VISIBLE
-void	longjmperror(void);
+void		longjmperror(void);
 #endif
-int	setjmp(jmp_buf) __returns_twice;
+int		setjmp(jmp_buf) __returns_twice;
 #if __BSD_VISIBLE || __POSIX_VISIBLE || __XSI_VISIBLE
-void	siglongjmp(sigjmp_buf, int) __dead2;
-int	sigsetjmp(sigjmp_buf, int) __returns_twice;
+_Noreturn void	siglongjmp(sigjmp_buf, int);
+int		sigsetjmp(sigjmp_buf, int) __returns_twice;
 #endif
 __END_DECLS
 
Index: include/stdlib.h
===================================================================
--- include/stdlib.h	(revision 284138)
+++ include/stdlib.h	(working copy)
@@ -249,7 +249,7 @@
 void	*alloca(size_t);
 #endif
 
-void	 abort2(const char *, int, void **) __dead2;
+_Noreturn void	 abort2(const char *, int, void **);
 __uint32_t
 	 arc4random(void);
 void	 arc4random_addrandom(unsigned char *, int);
Index: include/unistd.h
===================================================================
--- include/unistd.h	(revision 284138)
+++ include/unistd.h	(working copy)
@@ -318,7 +318,7 @@
 
 __BEGIN_DECLS
 /* 1003.1-1990 */
-void	 _exit(int) __dead2;
+_Noreturn void	 _exit(int);
 int	 access(const char *, int);
 unsigned int	 alarm(unsigned int);
 int	 chdir(const char *);

--------------090003010508000202020705--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?55844668.60204>