* I experienced that a proper path for temporary files is needed by byacc under Windows commandline, otherwise there's a risk of empty files. The TEMP environment variable is always defined in Windows. * The noreturn attribute needs to be specified before function declaration to be portable among compilers (gcc, clang, msvc). The patch is the easiest possible and not necessarily the best or prettiest. ================================= diff --git a/main.c b/main.c index 9a8099c..66287da 100644 --- a/main.c +++ b/main.c @@ -579,6 +579,7 @@ open_tmpfile(const char *label) const char *mark; if ((tmpdir = getenv("TMPDIR")) == 0 || access(tmpdir, W_OK) != 0) + if ((tmpdir = getenv("TEMP")) == 0 || access(tmpdir, W_OK) != 0) { #ifdef P_tmpdir tmpdir = P_tmpdir; ================================= diff --git a/defs.h b/defs.h index eac5305..cdbec9e 100644 --- a/defs.h +++ b/defs.h @@ -413,6 +413,21 @@ extern param *parse_param; #endif #endif +#ifdef __GNUC__ +#define ATTRIBUTE_NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define ATTRIBUTE_NORETURN __declspec(noreturn) +#else +#define ATTRIBUTE_NORETURN +#endif + +#if defined(NDEBUG) && defined(_MSC_VER) +#define NODEFAULT __assume(0); +#else +#define NODEFAULT +#endif +#define NOTREACHED NODEFAULT + #ifndef GCC_UNUSED #if defined(__unused) #define GCC_UNUSED __unused @@ -440,20 +455,31 @@ struct ainfo extern void arg_number_disagree_warning(int a_lineno, char *a_name); extern void arg_type_disagree_warning(int a_lineno, int i, char *a_name); +ATTRIBUTE_NORETURN extern void at_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; extern void at_warning(int a_lineno, int i); +ATTRIBUTE_NORETURN extern void bad_formals(void) GCC_NORETURN; extern void default_action_warning(char *s); extern void destructor_redeclared_warning(const struct ainfo *); +ATTRIBUTE_NORETURN extern void dollar_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; extern void dollar_warning(int a_lineno, int i); +ATTRIBUTE_NORETURN extern void fatal(const char *msg) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void illegal_character(char *c_cptr) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void illegal_tag(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void missing_brace(void) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void no_grammar(void) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void no_space(void) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void open_error(const char *filename) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void over_unionized(char *u_cptr) GCC_NORETURN; extern void prec_redeclared(void); extern void reprec_warning(char *s); @@ -461,25 +487,41 @@ extern void restarted_warning(void); extern void retyped_warning(char *s); extern void revalued_warning(char *s); extern void start_requires_args(char *a_name); +ATTRIBUTE_NORETURN extern void syntax_error(int st_lineno, char *st_line, char *st_cptr) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void terminal_lhs(int s_lineno) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void terminal_start(char *s) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void tokenized_start(char *s) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void undefined_goal(char *s) GCC_NORETURN; extern void undefined_symbol_warning(char *s); +ATTRIBUTE_NORETURN extern void unexpected_EOF(void) GCC_NORETURN; extern void unknown_arg_warning(int d_lineno, const char *dlr_opt, const char *d_arg, const char *d_line, const char *d_cptr); +ATTRIBUTE_NORETURN extern void unknown_rhs(int i) GCC_NORETURN; extern void unsupported_flag_warning(const char *flag, const char *details); +ATTRIBUTE_NORETURN extern void unterminated_action(const struct ainfo *) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void unterminated_comment(const struct ainfo *) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void unterminated_string(const struct ainfo *) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void unterminated_text(const struct ainfo *) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void unterminated_union(const struct ainfo *) GCC_NORETURN; extern void untyped_arg_warning(int a_lineno, const char *dlr_opt, const char *a_name); +ATTRIBUTE_NORETURN extern void untyped_lhs(void) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void untyped_rhs(int i, char *s) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void used_reserved(char *s) GCC_NORETURN; +ATTRIBUTE_NORETURN extern void unterminated_arglist(const struct ainfo *) GCC_NORETURN; extern void wrong_number_args_warning(const char *which, const char *a_name); extern void wrong_type_for_arg_warning(int i, char *a_name); @@ -499,6 +541,7 @@ extern void show_shifts(void); /* main.c */ extern void *allocate(size_t n); +ATTRIBUTE_NORETURN extern void done(int k) GCC_NORETURN; /* mkpar.c */ ================================= diff --git a/reader.c b/reader.c index ebf40d2..74ebaba 100644 --- a/reader.c +++ b/reader.c @@ -437,7 +437,7 @@ nextc(void) /* *INDENT-OFF* */ static struct keyword { - char name[14]; + char name[15]; int token; } keywords[] = { @@ -1353,7 +1353,8 @@ get_number(void) if (n > MAXYYINT) { syntax_error(lineno, line, base); - n = 0; + NOTREACHED; + n = 0; break; } }