Re: GLR causing warning about _Noreturn in C99

Akim Demaille <[email protected]> Wed, 6 Jan 2021 07:04:06 +0100
Newsgroups gmane.comp.parsers.bison.general
Message-ID <[email protected]>
Hi Joe,

Thanks for the report.

> Le 3 janv. 2021 à 19:23, Joe Nelson <[email protected]> a écrit :
> 
> When I enable %glr-parser, it generates two functions marked with
> _Noreturn:
> 
> 	_Noreturn static void
> 	yyFail (yyGLRStack* yystackp, void *scanner, const char* yymsg)
> 
> 	_Noreturn static void
> 	yyMemoryExhausted (yyGLRStack* yystackp)
> 
> Since my compile flags include -std=c99 -pedantic, clang warns me:
> 
> 	warning: _Noreturn functions are a C11-specific feature
> 
> The generated parser tries to define _Noreturn appropriately with these
> preprocessor rules:
> 
> 	/* The _Noreturn keyword of C11.  */
> 	#ifndef _Noreturn
> 	# if (defined __cplusplus \
> 		  && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
> 			  || (defined _MSC_VER && 1900 <= _MSC_VER)))
> 	#  define _Noreturn [[noreturn]]
> 	# elif (!defined __cplusplus                     \
> 			&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
> 				|| 4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
> 				|| (defined __apple_build_version__ \
> 					? 6000000 <= __apple_build_version__ \
> 					: 3 < __clang_major__ + (5 <= __clang_minor__))))
> 	   /* _Noreturn works as-is.  */
> 	# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
> 	#  define _Noreturn __attribute__ ((__noreturn__))
> 	# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
> 	#  define _Noreturn __declspec (noreturn)
> 	# else
> 	#  define _Noreturn
> 	# endif
> 	#endif
> 
> However I confirmed it's hitting the condition marked
> /* _Noreturn works as-is.  */
> whereas I would like it to respect the value of __STDC_VERSION__ that I
> set with the -std=c99 compiler flag. I'm not sure of the history behind
> the preprocessor checks in that section, but maybe you could simplify
> and go primarily by the stdc version?
> 
> Here are the values of the macros in my environment:
> 
> #define __GNUC__ 4
> #define __GNUC_MINOR__ 2
> #define __STDC_VERSION__ 199901L
> #define __apple_build_version__ 10001145
> #define __clang_major__ 10
> #define __clang_minor__ 0
> 
> Here are my compiler and bison version:
> 
> Bison 3.7.4
> Clang
> 	Apple LLVM version 10.0.0 (clang-1000.11.45.5)
> 	Target: x86_64-apple-darwin17.7.0

This piece of code comes from gnulib (well, it was copied-pasted from
there). This place is touchy and already pretty hairy. I don't want to
depart from what gnulib does.  After all, this is only a warning.

If Paul wants to give it a shot, that would be fine.  But I won't.

Cheers!