The following avoids ICEing on a indirect calls with a fnspec
in modref analysis.
2021-01-19 Richard Biener <rguenther@suse.de>
PR ipa/98330
* ipa-modref.c (analyze_stmt): Only record a summary for a
direct call.
* g++.dg/pr98330.C: New testcase.
* gcc.dg/pr98330.c: Likewise.
&& (!fnspec.global_memory_read_p ()
|| !fnspec.global_memory_written_p ()))
{
&& (!fnspec.global_memory_read_p ()
|| !fnspec.global_memory_written_p ()))
{
- fnspec_summaries->get_create
- (cgraph_node::get (current_function_decl)->get_edge (stmt))
- ->fnspec = xstrdup (fnspec.get_str ());
- if (dump_file)
- fprintf (dump_file, " Recorded fnspec %s\n", fnspec.get_str ());
+ cgraph_edge *e = cgraph_node::get (current_function_decl)->get_edge (stmt);
+ if (e->callee)
+ {
+ fnspec_summaries->get_create (e)->fnspec = xstrdup (fnspec.get_str ());
+ if (dump_file)
+ fprintf (dump_file, " Recorded fnspec %s\n", fnspec.get_str ());
+ }
--- /dev/null
+// { dg-do compile }
+// { dg-options -O2 }
+
+float f (float x)
+{
+ return __builtin_pow[1] (x, 2); // { dg-warning "pointer to a function used in arithmetic" }
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+float f (__typeof (__builtin_pow) fn, float x)
+{
+ return fn (x, 2);
+}