Commit fb2675cb by Paolo Bonzini Committed by Paolo Bonzini

system.h (HAVE_DESIGNATED_INITIALIZERS, [...]): Do not use "defined" in macros.

gcc:
2016-11-23  Paolo Bonzini  <bonzini@gnu.org>

	* system.h (HAVE_DESIGNATED_INITIALIZERS,
	HAVE_DESIGNATED_UNION_INITIALIZERS): Do not use
	"defined" in macros.
	* doc/cpp.texi (Defined): Mention -Wexpansion-to-defined.
	* doc/cppopts.texi (Invocation): Document -Wexpansion-to-defined.
	* doc/invoke.texi (Warning Options): Document -Wexpansion-to-defined.

gcc/c-family:
2016-11-23  Paolo Bonzini  <bonzini@gnu.org>

	* c.opt (Wexpansion-to-defined): New.

gcc/testsuite:
2016-11-23  Paolo Bonzini  <bonzini@gnu.org>

	* gcc.dg/cpp/defined.c: Mark newly introduced warnings and
	adjust for warning->pedwarn change.
	* gcc.dg/cpp/defined-syshdr.c,
	gcc.dg/cpp/defined-Wexpansion-to-defined.c,
	gcc.dg/cpp/defined-Wextra-Wno-expansion-to-defined.c,
	gcc.dg/cpp/defined-Wextra.c,
	gcc.dg/cpp/defined-Wno-expansion-to-defined.c: New testcases.

libcpp:
2016-11-23  Paolo Bonzini  <bonzini@gnu.org>

	* include/cpplib.h (struct cpp_options): Add new member
	warn_expansion_to_defined.
	(CPP_W_EXPANSION_TO_DEFINED): New enum member.
	* expr.c (parse_defined): Warn for all uses of "defined"
	in macros, and tie warning to CPP_W_EXPANSION_TO_DEFINED.
	Make it a pedwarning instead of a warning.
	* system.h (HAVE_DESIGNATED_INITIALIZERS): Do not use
	"defined" in macros.

From-SVN: r242743
parent baf53c47
2016-11-23 Paolo Bonzini <bonzini@gnu.org>
* system.h (HAVE_DESIGNATED_INITIALIZERS,
HAVE_DESIGNATED_UNION_INITIALIZERS): Do not use
"defined" in macros.
* doc/cpp.texi (Defined): Mention -Wexpansion-to-defined.
* doc/cppopts.texi (Invocation): Document -Wexpansion-to-defined.
* doc/invoke.texi (Warning Options): Document -Wexpansion-to-defined.
2016-11-23 Georg-Johann Lay <avr@gjlay.de> 2016-11-23 Georg-Johann Lay <avr@gjlay.de>
PR target/60300 PR target/60300
2016-11-23 Paolo Bonzini <bonzini@gnu.org>
* c.opt (Wexpansion-to-defined): New.
2016-11-23 Jakub Jelinek <jakub@redhat.com> 2016-11-23 Jakub Jelinek <jakub@redhat.com>
PR target/78451 PR target/78451
......
...@@ -573,6 +573,10 @@ Wdouble-promotion ...@@ -573,6 +573,10 @@ Wdouble-promotion
C ObjC C++ ObjC++ Var(warn_double_promotion) Warning C ObjC C++ ObjC++ Var(warn_double_promotion) Warning
Warn about implicit conversions from \"float\" to \"double\". Warn about implicit conversions from \"float\" to \"double\".
Wexpansion-to-defined
C ObjC C++ ObjC++ CPP(warn_expansion_to_defined) CppReason(CPP_W_EXPANSION_TO_DEFINED) Var(cpp_warn_expansion_to_defined) Init(0) Warning EnabledBy(Wextra || Wpedantic)
Warn if \"defined\" is used outside #if.
Wimplicit-function-declaration Wimplicit-function-declaration
C ObjC Var(warn_implicit_function_declaration) Init(-1) Warning LangEnabledBy(C ObjC,Wimplicit) C ObjC Var(warn_implicit_function_declaration) Init(-1) Warning LangEnabledBy(C ObjC,Wimplicit)
Warn about implicit function declarations. Warn about implicit function declarations.
......
...@@ -3369,7 +3369,9 @@ If the @code{defined} operator appears as a result of a macro expansion, ...@@ -3369,7 +3369,9 @@ If the @code{defined} operator appears as a result of a macro expansion,
the C standard says the behavior is undefined. GNU cpp treats it as a the C standard says the behavior is undefined. GNU cpp treats it as a
genuine @code{defined} operator and evaluates it normally. It will warn genuine @code{defined} operator and evaluates it normally. It will warn
wherever your code uses this feature if you use the command-line option wherever your code uses this feature if you use the command-line option
@option{-pedantic}, since other compilers may handle it differently. @option{-Wpedantic}, since other compilers may handle it differently. The
warning is also enabled by @option{-Wextra}, and can also be enabled
individually with @option{-Wexpansion-to-defined}.
@node Else @node Else
@subsection Else @subsection Else
......
...@@ -120,6 +120,12 @@ Warn whenever an identifier which is not a macro is encountered in an ...@@ -120,6 +120,12 @@ Warn whenever an identifier which is not a macro is encountered in an
@samp{#if} directive, outside of @samp{defined}. Such identifiers are @samp{#if} directive, outside of @samp{defined}. Such identifiers are
replaced with zero. replaced with zero.
@item -Wexpansion-to-defined
@opindex Wexpansion-to-defined
Warn whenever @samp{defined} is encountered in the expansion of a macro
(including the case where the macro is expanded by an @samp{#if} directive).
Such usage is not portable.
@item -Wunused-macros @item -Wunused-macros
@opindex Wunused-macros @opindex Wunused-macros
Warn about macros defined in the main file that are unused. A macro Warn about macros defined in the main file that are unused. A macro
......
...@@ -5320,6 +5320,11 @@ Warn when a declaration is found after a statement in a block. This ...@@ -5320,6 +5320,11 @@ Warn when a declaration is found after a statement in a block. This
construct, known from C++, was introduced with ISO C99 and is by default construct, known from C++, was introduced with ISO C99 and is by default
allowed in GCC@. It is not supported by ISO C90. @xref{Mixed Declarations}. allowed in GCC@. It is not supported by ISO C90. @xref{Mixed Declarations}.
@item -Wexpansion-to-defined
@opindex Wexpansion-to-defined
Warn whenever @samp{defined} is encountered in the expansion of a macro.
This warning is also enabled by @option{-Wpedantic} and @option{-Wextra}.
@item -Wundef @item -Wundef
@opindex Wundef @opindex Wundef
@opindex Wno-undef @opindex Wno-undef
......
...@@ -577,15 +577,21 @@ extern int vsnprintf (char *, size_t, const char *, va_list); ...@@ -577,15 +577,21 @@ extern int vsnprintf (char *, size_t, const char *, va_list);
/* 1 if we have C99 designated initializers. */ /* 1 if we have C99 designated initializers. */
#if !defined(HAVE_DESIGNATED_INITIALIZERS) #if !defined(HAVE_DESIGNATED_INITIALIZERS)
#ifdef __cplusplus
#define HAVE_DESIGNATED_INITIALIZERS 0
#else
#define HAVE_DESIGNATED_INITIALIZERS \ #define HAVE_DESIGNATED_INITIALIZERS \
(((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) \ (((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L))
&& !defined(__cplusplus)) #endif
#endif #endif
#if !defined(HAVE_DESIGNATED_UNION_INITIALIZERS) #if !defined(HAVE_DESIGNATED_UNION_INITIALIZERS)
#ifdef __cplusplus
#define HAVE_DESIGNATED_UNION_INITIALIZERS (GCC_VERSION >= 4007)
#else
#define HAVE_DESIGNATED_UNION_INITIALIZERS \ #define HAVE_DESIGNATED_UNION_INITIALIZERS \
(((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) \ (((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L))
&& (!defined(__cplusplus) || (GCC_VERSION >= 4007))) #endif
#endif #endif
#if HAVE_SYS_STAT_H #if HAVE_SYS_STAT_H
......
2016-11-23 Paolo Bonzini <bonzini@gnu.org>
* gcc.dg/cpp/defined.c: Mark newly introduced warnings and
adjust for warning->pedwarn change.
* gcc.dg/cpp/defined-syshdr.c,
gcc.dg/cpp/defined-Wexpansion-to-defined.c,
gcc.dg/cpp/defined-Wextra-Wno-expansion-to-defined.c,
gcc.dg/cpp/defined-Wextra.c,
gcc.dg/cpp/defined-Wno-expansion-to-defined.c: New testcases.
2016-11-23 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> 2016-11-23 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.dg/uninit-19.c: Add -finline-small-functions for avr. * gcc.dg/uninit-19.c: Add -finline-small-functions for avr.
......
/* Copyright (C) 2000 Free Software Foundation, Inc. */
/* { dg-do preprocess } */
/* { dg-options "-Wexpansion-to-defined" } */
/* Use of defined in different contexts. */
/* Source: Neil Booth, 29 Oct 2000, Zack Weinberg 11 Dec 2000. */
#define Z
#define bad0 defined Z
#if !bad0 /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
#define bad1 defined
#if !bad1 Z /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
#if !bad1 (Z) /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
#define bad2 defined (Z
#if !bad2) /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
/* Copyright (C) 2000 Free Software Foundation, Inc. */
/* { dg-do preprocess } */
/* { dg-options "-Wextra -Wno-expansion-to-defined" } */
/* Use of defined in different contexts. */
/* Source: Neil Booth, 29 Oct 2000, Zack Weinberg 11 Dec 2000. */
#define Z
#define bad0 defined Z
#if !bad0 /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
#define bad1 defined
#if !bad1 Z /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
#if !bad1 (Z) /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
#define bad2 defined (Z
#if !bad2) /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
/* Copyright (C) 2000 Free Software Foundation, Inc. */
/* { dg-do preprocess } */
/* { dg-options "-Wextra" } */
/* Use of defined in different contexts. */
/* Source: Neil Booth, 29 Oct 2000, Zack Weinberg 11 Dec 2000. */
#define Z
#define bad0 defined Z
#if !bad0 /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
#define bad1 defined
#if !bad1 Z /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
#if !bad1 (Z) /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
#define bad2 defined (Z
#if !bad2) /* { dg-warning "may not be portable" } */
#error Z is defined
#endif
/* Copyright (C) 2000 Free Software Foundation, Inc. */
/* { dg-do preprocess } */
/* { dg-options "-ansi -pedantic-errors -Wno-expansion-to-defined" } */
/* Use of defined in different contexts. */
/* Source: Neil Booth, 29 Oct 2000, Zack Weinberg 11 Dec 2000. */
#define Z
#define bad0 defined Z
#if !bad0 /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
#define bad1 defined
#if !bad1 Z /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
#if !bad1 (Z) /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
#define bad2 defined (Z
#if !bad2) /* { dg-bogus "may not be portable" } */
#error Z is defined
#endif
# 1 "defined-syshdr.c" 1
/* { dg-do preprocess } */
/* { dg-options "-Wexpansion-to-defined" } */
#define defined_outside_sys_hdr defined FOO
# 36 "some-system-header.h" 1 3
#define defined_inside_sys_hdr defined FOO
/* In a system header, it's acceptable. */
#if defined_outside_sys_hdr /* { dg-bogus "may not be portable" } */
#endif
# 16 "defined-syshdr.c" 2
/* Back to _not_ in a system header */
#if defined_outside_sys_hdr /* { dg-message "may not be portable" } */
#endif
/* Currently we warn about this, but it is probably a good idea not to. */
#if defined_inside_sys_hdr /* { dg-bogus "may not be portable" "" { xfail *-*-* } } */
#endif
int x;
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
/* The behavior of "defined" when it comes from a macro expansion is /* The behavior of "defined" when it comes from a macro expansion is
now documented. */ now documented. */
#if is_Z_defined #if is_Z_defined /* { dg-error "may not be portable" } */
#error Macro expanding into defined operator test 1 #error Macro expanding into defined operator test 1
#endif #endif
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#error Z is defined #error Z is defined
#endif #endif
#if !is_Z_defined #if !is_Z_defined /* { dg-error "may not be portable" } */
#error Macro expanding into defined operator test 2 #error Macro expanding into defined operator test 2
#endif #endif
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
/* The behavior of "defined" when it comes from a macro expansion is /* The behavior of "defined" when it comes from a macro expansion is
now documented. */ now documented. */
#if is_Z_defined #if is_Z_defined /* { dg-error "may not be portable" } */
#error Macro expanding into defined operator test 1 #error Macro expanding into defined operator test 1
#endif #endif
...@@ -63,23 +63,23 @@ ...@@ -63,23 +63,23 @@
#error Z is defined #error Z is defined
#endif #endif
#if !is_Z_defined #if !is_Z_defined /* { dg-error "may not be portable" } */
#error Macro expanding into defined operator test 2 #error Macro expanding into defined operator test 2
#endif #endif
/* Use of defined in different contexts. */ /* Use of defined in different contexts. */
#define bad1 defined #define bad1 defined
#if !bad1 Z /* { dg-warning "may not be portable" } */ #if !bad1 Z /* { dg-error "may not be portable" } */
#error Z is defined #error Z is defined
#endif #endif
#if !bad1 (Z) /* { dg-warning "may not be portable" } */ #if !bad1 (Z) /* { dg-error "may not be portable" } */
#error Z is defined #error Z is defined
#endif #endif
#define bad2 defined (Z #define bad2 defined (Z
#if !bad2) /* { dg-warning "may not be portable" } */ #if !bad2) /* { dg-error "may not be portable" } */
#error Z is defined #error Z is defined
#endif #endif
2016-11-23 Paolo Bonzini <bonzini@gnu.org>
* include/cpplib.h (struct cpp_options): Add new member
warn_expansion_to_defined.
(CPP_W_EXPANSION_TO_DEFINED): New enum member.
* expr.c (parse_defined): Warn for all uses of "defined"
in macros, and tie warning to CPP_W_EXPANSION_TO_DEFINED.
Make it a pedwarning instead of a warning.
* system.h (HAVE_DESIGNATED_INITIALIZERS): Do not use
"defined" in macros.
2016-11-17 David Malcolm <dmalcolm@redhat.com> 2016-11-17 David Malcolm <dmalcolm@redhat.com>
* charset.c (cpp_interpret_string_1): Skip locations from * charset.c (cpp_interpret_string_1): Skip locations from
......
...@@ -1031,9 +1031,11 @@ parse_defined (cpp_reader *pfile) ...@@ -1031,9 +1031,11 @@ parse_defined (cpp_reader *pfile)
if (node) if (node)
{ {
if (pfile->context != initial_context && CPP_PEDANTIC (pfile)) if ((pfile->context != initial_context
cpp_error (pfile, CPP_DL_WARNING, || initial_context != &pfile->base_context)
"this use of \"defined\" may not be portable"); && CPP_OPTION (pfile, warn_expansion_to_defined))
cpp_pedwarning (pfile, CPP_W_EXPANSION_TO_DEFINED,
"this use of \"defined\" may not be portable");
_cpp_mark_macro_used (node); _cpp_mark_macro_used (node);
if (!(node->flags & NODE_USED)) if (!(node->flags & NODE_USED))
......
...@@ -415,6 +415,10 @@ struct cpp_options ...@@ -415,6 +415,10 @@ struct cpp_options
/* Nonzero means warn if undefined identifiers are evaluated in an #if. */ /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
unsigned char warn_undef; unsigned char warn_undef;
/* Nonzero means warn if "defined" is encountered in a place other than
an #if. */
unsigned char warn_expansion_to_defined;
/* Nonzero means warn of unused macros from the main file. */ /* Nonzero means warn of unused macros from the main file. */
unsigned char warn_unused_macros; unsigned char warn_unused_macros;
...@@ -1040,7 +1044,8 @@ enum { ...@@ -1040,7 +1044,8 @@ enum {
CPP_W_DATE_TIME, CPP_W_DATE_TIME,
CPP_W_PEDANTIC, CPP_W_PEDANTIC,
CPP_W_C90_C99_COMPAT, CPP_W_C90_C99_COMPAT,
CPP_W_CXX11_COMPAT CPP_W_CXX11_COMPAT,
CPP_W_EXPANSION_TO_DEFINED
}; };
/* Output a diagnostic of some kind. */ /* Output a diagnostic of some kind. */
......
...@@ -375,9 +375,12 @@ extern void abort (void); ...@@ -375,9 +375,12 @@ extern void abort (void);
??? C99 designated initializers are not supported by most C++ ??? C99 designated initializers are not supported by most C++
compilers, including G++. -- gdr, 2005-05-18 */ compilers, including G++. -- gdr, 2005-05-18 */
#if !defined(HAVE_DESIGNATED_INITIALIZERS) #if !defined(HAVE_DESIGNATED_INITIALIZERS)
#ifdef __cplusplus
#define HAVE_DESIGNATED_INITIALIZERS 0
#else
#define HAVE_DESIGNATED_INITIALIZERS \ #define HAVE_DESIGNATED_INITIALIZERS \
(!defined(__cplusplus) \ ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L))
&& ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L))) #endif
#endif #endif
#ifndef offsetof #ifndef offsetof
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment