c-family: Avoid ICEs on calls to internal functions [PR95963]
authorJakub Jelinek <jakub@redhat.com>
Tue, 30 Jun 2020 09:42:54 +0000 (11:42 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 30 Jun 2020 09:42:54 +0000 (11:42 +0200)
The following testcase ICEs since recent Martin's -Wnonnull changes,
we see a CALL_EXPR and ICE because CALL_EXPR_FN is NULL, which is
valid for internal function calls.  Internal function calls don't have a
function type, and will never have format_arg attribute on them nor will
serve as the i18n routines -Wformat cares about.

2020-06-30  Jakub Jelinek  <jakub@redhat.com>

PR c++/95963
* c-common.c (check_function_arguments_recurse): Don't crash on
calls to internal functions.

* g++.dg/cpp1z/launder9.C: New test.

gcc/c-family/c-common.c
gcc/testsuite/g++.dg/cpp1z/launder9.C [new file with mode: 0644]

index cfd12c0177ffc4699a320418785cd8776b001c64..aae1ddb6b895c935a59b47b23d71044e919de21b 100644 (file)
@@ -5815,7 +5815,7 @@ check_function_arguments_recurse (void (*callback)
       return;
     }
 
-  if (TREE_CODE (param) == CALL_EXPR)
+  if (TREE_CODE (param) == CALL_EXPR && CALL_EXPR_FN (param))
     {
       tree type = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (param)));
       tree attrs;
diff --git a/gcc/testsuite/g++.dg/cpp1z/launder9.C b/gcc/testsuite/g++.dg/cpp1z/launder9.C
new file mode 100644 (file)
index 0000000..89d7ecf
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/95963
+// { dg-do compile }
+// { dg-options "-Wnonnull" }
+
+struct A { virtual void foo (); };
+
+void
+bar (A *p)
+{
+  __builtin_launder (p)->foo ();
+}