public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] handle erroneous types in attribute nonnull (PR 100783)
@ 2021-05-27 16:00 Martin Sebor
  2021-05-27 17:40 ` Jeff Law
  0 siblings, 1 reply; 2+ messages in thread
From: Martin Sebor @ 2021-05-27 16:00 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 830 bytes --]

When attribute nonnull is applied to an argument of an erroneous
type the attribute positional argument validation function ICEs
while printing a warning that mentions the invalid type.

The attached patch changes the validation function to ignore
erroneous types on the assumption that they must have already
been diagnosed.  It also enhances the pretty-printer to detect
erroneous types and print "{erroneous}" instead of causing
an ICE.  There already is code in the pretty printer that tries
to be robust in thew presence of erroneous types without actually
printing them, and this extends the detection to also print them.
(With the first part of this patch I don't have a test case for
it but handling the condition gracefully feels preferable to
waiting for another bug report with invalid code triggering
an ICE).

Martin

[-- Attachment #2: gcc-100783.diff --]
[-- Type: text/x-patch, Size: 1988 bytes --]

PR c/100783 - ICE on -Wnonnull and erroneous type

gcc/c-family/ChangeLog:

	PR c/100783
	* c-attribs.c (positional_argument): Bail on erroneous types.

gcc/c/ChangeLog:

	PR c/100783
	* c-objc-common.c (print_type): Handle erroneous types.

gcc/testsuite/ChangeLog:

	PR c/100783
	* gcc.dg/nonnull-6.c: New test.

diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index 804374d5acc..756a91b1c0d 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -698,6 +698,9 @@ positional_argument (const_tree fntype, const_tree atname, tree pos,
 
   if (tree argtype = type_argument_type (fntype, ipos))
     {
+      if (argtype == error_mark_node)
+	return NULL_TREE;
+
       if (flags & POSARG_ELLIPSIS)
 	{
 	  if (argno < 1)
diff --git a/gcc/c/c-objc-common.c b/gcc/c/c-objc-common.c
index a68249d7011..b945de15ab8 100644
--- a/gcc/c/c-objc-common.c
+++ b/gcc/c/c-objc-common.c
@@ -185,6 +185,12 @@ get_aka_type (tree type)
 static void
 print_type (c_pretty_printer *cpp, tree t, bool *quoted)
 {
+  if (t == error_mark_node)
+    {
+      pp_string (cpp, _("{erroneous}"));
+      return;
+    }
+
   gcc_assert (TYPE_P (t));
   struct obstack *ob = pp_buffer (cpp)->obstack;
   char *p = (char *) obstack_base (ob);
diff --git a/gcc/testsuite/gcc.dg/nonnull-6.c b/gcc/testsuite/gcc.dg/nonnull-6.c
new file mode 100644
index 00000000000..8f368702e0e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/nonnull-6.c
@@ -0,0 +1,15 @@
+/* PR c/100783 - ICE on attribute nonnull and erroneous type
+   { dg-do compile }
+   { dg-options "-Wall" } */
+
+__attribute__((nonnull (1))) void
+f1 (char[][n]);                         // { dg-error "undeclared" }
+
+__attribute__((nonnull (2))) void
+f2 (int n, char[n][m]);                 // { dg-error "undeclared" }
+
+__attribute__((nonnull (1))) void
+f3 (char[*][n]);                        // { dg-error "undeclared" }
+
+__attribute__((nonnull (1))) void
+f4 (char[f1]);                          // { dg-error "size" }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] handle erroneous types in attribute nonnull (PR 100783)
  2021-05-27 16:00 [PATCH] handle erroneous types in attribute nonnull (PR 100783) Martin Sebor
@ 2021-05-27 17:40 ` Jeff Law
  0 siblings, 0 replies; 2+ messages in thread
From: Jeff Law @ 2021-05-27 17:40 UTC (permalink / raw)
  To: Martin Sebor, gcc-patches



On 5/27/2021 10:00 AM, Martin Sebor via Gcc-patches wrote:
> When attribute nonnull is applied to an argument of an erroneous
> type the attribute positional argument validation function ICEs
> while printing a warning that mentions the invalid type.
>
> The attached patch changes the validation function to ignore
> erroneous types on the assumption that they must have already
> been diagnosed.  It also enhances the pretty-printer to detect
> erroneous types and print "{erroneous}" instead of causing
> an ICE.  There already is code in the pretty printer that tries
> to be robust in thew presence of erroneous types without actually
> printing them, and this extends the detection to also print them.
> (With the first part of this patch I don't have a test case for
> it but handling the condition gracefully feels preferable to
> waiting for another bug report with invalid code triggering
> an ICE).
>
> Martin
>
> gcc-100783.diff
>
> PR c/100783 - ICE on -Wnonnull and erroneous type
>
> gcc/c-family/ChangeLog:
>
> 	PR c/100783
> 	* c-attribs.c (positional_argument): Bail on erroneous types.
>
> gcc/c/ChangeLog:
>
> 	PR c/100783
> 	* c-objc-common.c (print_type): Handle erroneous types.
>
> gcc/testsuite/ChangeLog:
>
> 	PR c/100783
> 	* gcc.dg/nonnull-6.c: New test.
OK
jeff


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-05-27 17:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-27 16:00 [PATCH] handle erroneous types in attribute nonnull (PR 100783) Martin Sebor
2021-05-27 17:40 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).