aboutsummaryrefslogtreecommitdiff
path: root/gcc/c/c-typeck.cc
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2023-12-01 08:10:12 +0100
committerFlorian Weimer <fweimer@redhat.com>2023-12-01 08:10:12 +0100
commit2c3db94d9fd07681f8806dae93d555779ff4dfb1 (patch)
tree358fb15404cf605c2ba6383290c2bae56ab07dda /gcc/c/c-typeck.cc
parent370432688259aed1c99f9b29d8d09e534fb94037 (diff)
downloadgcc-2c3db94d9fd07681f8806dae93d555779ff4dfb1.zip
gcc-2c3db94d9fd07681f8806dae93d555779ff4dfb1.tar.gz
gcc-2c3db94d9fd07681f8806dae93d555779ff4dfb1.tar.bz2
c: Turn int-conversion warnings into permerrors
gcc/ * doc/invoke.texi (Warning Options): Document changes. gcc/c/ PR c/96284 PR c/106416 * c-typeck.cc (build_conditional_expr): Use permerror_opt for pointer/integer type mismatches, based on -Wint-conversion. (pedwarn_permerror_init, permerror_init): New function. (pedwarn_init): Call pedwarn_permerror_init. (convert_for_assignment): Use permerror_opt and permerror_init for -Wint-conversion warnings. gcc/testsuite/ * gcc.dg/permerror-default.c (int_conversion_1) (int_conversion_2): Expect the new permerrors. * gcc.dg/permerror-gnu89-nopermissive.c (int_conversion_1) (int_conversion_2): Likewise. * gcc.dg/permerror-system.c: Likewise. * c-c++-common/pr77624-1.c (foo, bar): Expect error instead of warning. * gcc.dg/Wint-conversion-2.c: Compile with -fpermissive due to expected int-conversion warning. * gcc.dg/Wint-conversion-3.c: Likewise. * gcc.dg/Wint-conversion-4.c: New test. Based on gcc.dg/Wint-conversion-3.c. Expect int-conversion errors. * gcc.dg/assign-warn-1.c: Compile with -fpermissive. * gcc.dg/assign-warn-4.c: New file. Extracted from assign-warn1.c. Expect int-conversion errors. * gcc.dg/diagnostic-types-1.c: Compile with -fpermissive. * gcc.dg/diagnostic-types-2.c: New file. Extracted from gcc.dg/diagnostic-types-1.c. Expect some errors instead of warnings. * gcc.dg/gomp/pr35738.c: Compile with -fpermissive due to expected int-conversion error. * gcc.dg/gomp/pr35738-2.c: New test. Based on gcc.dg/gomp/pr35738.c. Expect int-converison errors. * gcc.dg/init-excess-3.c: Expect int-converison errors. * gcc.dg/overflow-warn-1.c: Likewise. * gcc.dg/overflow-warn-3.c: Likewise. * gcc.dg/param-type-mismatch.c: Compile with -fpermissive. * gcc.dg/param-type-mismatch-2.c: New test. Copied from gcc.dg/param-type-mismatch.c. Expect errors. * gcc.dg/pr61162-2.c: Compile with -fpermissive. * gcc.dg/pr61162-3.c: New test. Extracted from gcc.dg/pr61162-2.c. Expect int-conversion errors. * gcc.dg/spec-barrier-3.c: Use -fpermissive due to expected int-conversion error. * gcc.dg/spec-barrier-3a.c: New test. Based on gcc.dg/spec-barrier-3.c. Expect int-conversion errors. * gcc.target/aarch64/acle/memtag_2.c: Use -fpermissive due to expected int-conversion error. * gcc.target/aarch64/acle/memtag_2a.c: New test. Copied from gcc.target/aarch64/acle/memtag_2.c. Expect error. * gcc.target/aarch64/sve/acle/general-c/load_3.c (f1): Expect error. * gcc.target/aarch64/sve/acle/general-c/store_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_index_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c (f1): Likewise.
Diffstat (limited to 'gcc/c/c-typeck.cc')
-rw-r--r--gcc/c/c-typeck.cc97
1 files changed, 60 insertions, 37 deletions
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index f37496c..b309300 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -5479,8 +5479,9 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
&& (code2 == INTEGER_TYPE || code2 == BITINT_TYPE))
{
if (!null_pointer_constant_p (orig_op2))
- pedwarn (colon_loc, OPT_Wint_conversion,
- "pointer/integer type mismatch in conditional expression");
+ permerror_opt (colon_loc, OPT_Wint_conversion,
+ "pointer/integer type mismatch "
+ "in conditional expression");
else
{
op2 = null_pointer_node;
@@ -5491,8 +5492,9 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
&& (code1 == INTEGER_TYPE || code1 == BITINT_TYPE))
{
if (!null_pointer_constant_p (orig_op1))
- pedwarn (colon_loc, OPT_Wint_conversion,
- "pointer/integer type mismatch in conditional expression");
+ permerror_opt (colon_loc, OPT_Wint_conversion,
+ "pointer/integer type mismatch "
+ "in conditional expression");
else
{
op1 = null_pointer_node;
@@ -6588,28 +6590,48 @@ error_init (location_t loc, const char *gmsgid, ...)
inform (loc, "(near initialization for %qs)", ofwhat);
}
-/* Issue a pedantic warning for a bad initializer component. OPT is
- the option OPT_* (from options.h) controlling this warning or 0 if
- it is unconditionally given. GMSGID identifies the message. The
- component name is taken from the spelling stack. */
+/* Used to implement pedwarn_init and permerror_init. */
static void ATTRIBUTE_GCC_DIAG (3,0)
-pedwarn_init (location_t loc, int opt, const char *gmsgid, ...)
+pedwarn_permerror_init (location_t loc, int opt, const char *gmsgid,
+ va_list *ap, diagnostic_t kind)
{
/* Use the location where a macro was expanded rather than where
it was defined to make sure macros defined in system headers
but used incorrectly elsewhere are diagnosed. */
location_t exploc = expansion_point_location_if_in_system_header (loc);
auto_diagnostic_group d;
- va_list ap;
- va_start (ap, gmsgid);
- bool warned = emit_diagnostic_valist (DK_PEDWARN, exploc, opt, gmsgid, &ap);
- va_end (ap);
+ bool warned = emit_diagnostic_valist (kind, exploc, opt, gmsgid, ap);
char *ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
if (*ofwhat && warned)
inform (exploc, "(near initialization for %qs)", ofwhat);
}
+/* Issue a pedantic warning for a bad initializer component. OPT is
+ the option OPT_* (from options.h) controlling this warning or 0 if
+ it is unconditionally given. GMSGID identifies the message. The
+ component name is taken from the spelling stack. */
+
+static void ATTRIBUTE_GCC_DIAG (3,0)
+pedwarn_init (location_t loc, int opt, const char *gmsgid, ...)
+{
+ va_list ap;
+ va_start (ap, gmsgid);
+ pedwarn_permerror_init (loc, opt, gmsgid, &ap, DK_PEDWARN);
+ va_end (ap);
+}
+
+/* Like pedwarn_init, but issue a permerror. */
+
+static void ATTRIBUTE_GCC_DIAG (3,0)
+permerror_init (location_t loc, int opt, const char *gmsgid, ...)
+{
+ va_list ap;
+ va_start (ap, gmsgid);
+ pedwarn_permerror_init (loc, opt, gmsgid, &ap, DK_PERMERROR);
+ va_end (ap);
+}
+
/* Issue a warning for a bad initializer component.
OPT is the OPT_W* value corresponding to the warning option that
@@ -7659,27 +7681,28 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type,
auto_diagnostic_group d;
range_label_for_type_mismatch rhs_label (rhstype, type);
gcc_rich_location richloc (expr_loc, &rhs_label);
- if (pedwarn (&richloc, OPT_Wint_conversion,
- "passing argument %d of %qE makes pointer from "
- "integer without a cast", parmnum, rname))
+ if (permerror_opt (&richloc, OPT_Wint_conversion,
+ "passing argument %d of %qE makes pointer "
+ "from integer without a cast", parmnum, rname))
inform_for_arg (fundecl, expr_loc, parmnum, type, rhstype);
}
break;
case ic_assign:
- pedwarn (location, OPT_Wint_conversion,
- "assignment to %qT from %qT makes pointer from integer "
- "without a cast", type, rhstype);
+ permerror_opt (location, OPT_Wint_conversion,
+ "assignment to %qT from %qT makes pointer from "
+ "integer without a cast", type, rhstype);
break;
case ic_init:
case ic_init_const:
- pedwarn_init (location, OPT_Wint_conversion,
- "initialization of %qT from %qT makes pointer from "
- "integer without a cast", type, rhstype);
+ permerror_init (location, OPT_Wint_conversion,
+ "initialization of %qT from %qT makes pointer "
+ "from integer without a cast", type, rhstype);
break;
case ic_return:
- pedwarn (location, OPT_Wint_conversion, "returning %qT from a "
- "function with return type %qT makes pointer from "
- "integer without a cast", rhstype, type);
+ permerror_init (location, OPT_Wint_conversion,
+ "returning %qT from a function with return type "
+ "%qT makes pointer from integer without a cast",
+ rhstype, type);
break;
default:
gcc_unreachable ();
@@ -7697,27 +7720,27 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type,
auto_diagnostic_group d;
range_label_for_type_mismatch rhs_label (rhstype, type);
gcc_rich_location richloc (expr_loc, &rhs_label);
- if (pedwarn (&richloc, OPT_Wint_conversion,
- "passing argument %d of %qE makes integer from "
- "pointer without a cast", parmnum, rname))
+ if (permerror_opt (&richloc, OPT_Wint_conversion,
+ "passing argument %d of %qE makes integer from "
+ "pointer without a cast", parmnum, rname))
inform_for_arg (fundecl, expr_loc, parmnum, type, rhstype);
}
break;
case ic_assign:
- pedwarn (location, OPT_Wint_conversion,
- "assignment to %qT from %qT makes integer from pointer "
- "without a cast", type, rhstype);
+ permerror_opt (location, OPT_Wint_conversion,
+ "assignment to %qT from %qT makes integer from "
+ "pointer without a cast", type, rhstype);
break;
case ic_init:
case ic_init_const:
- pedwarn_init (location, OPT_Wint_conversion,
- "initialization of %qT from %qT makes integer from "
- "pointer without a cast", type, rhstype);
+ permerror_init (location, OPT_Wint_conversion,
+ "initialization of %qT from %qT makes integer "
+ "from pointer without a cast", type, rhstype);
break;
case ic_return:
- pedwarn (location, OPT_Wint_conversion, "returning %qT from a "
- "function with return type %qT makes integer from "
- "pointer without a cast", rhstype, type);
+ permerror_opt (location, OPT_Wint_conversion, "returning %qT from a "
+ "function with return type %qT makes integer from "
+ "pointer without a cast", rhstype, type);
break;
default:
gcc_unreachable ();