Message ID | 20220214093253.0635313A3C@imap2.suse-dmz.suse.de |
---|---|
State | New |
Headers | show |
Series | c/104505 - ICE with internal function call in diagnostic expression | expand |
On Mon, Feb 14, 2022 at 10:32:52AM +0100, Richard Biener wrote: > The following handles internal function calls similar to how the > C++ frontend does, avoiding ICEing on those. > > Bootstrapped and tested on x86_64-unkown-linux-gnu, OK? > > Thanks, > Richard. > > 2022-02-14 Richard Biener <rguenther@suse.de> > > PR c/104505 > gcc/c-family/ > * c-pretty-print.cc (c_pretty_printer::postfix_expression): Handle > internal function calls. > > gcc/testsuite/ > * c-c++-common/pr104505.c: New testcase. LGTM. Jakub
diff --git a/gcc/c-family/c-pretty-print.cc b/gcc/c-family/c-pretty-print.cc index ceedaea962a..dac17753acb 100644 --- a/gcc/c-family/c-pretty-print.cc +++ b/gcc/c-family/c-pretty-print.cc @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "selftest.h" #include "langhooks.h" #include "options.h" +#include "internal-fn.h" /* The pretty-printer code is primarily designed to closely follow (GNU) C and C++ grammars. That is to be contrasted with spaghetti @@ -1601,7 +1602,10 @@ c_pretty_printer::postfix_expression (tree e) { call_expr_arg_iterator iter; tree arg; - postfix_expression (CALL_EXPR_FN (e)); + if (CALL_EXPR_FN (e) != NULL_TREE) + postfix_expression (CALL_EXPR_FN (e)); + else + pp_string (this, internal_fn_name (CALL_EXPR_IFN (e))); pp_c_left_paren (this); FOR_EACH_CALL_EXPR_ARG (arg, iter, e) { diff --git a/gcc/testsuite/c-c++-common/pr104505.c b/gcc/testsuite/c-c++-common/pr104505.c new file mode 100644 index 00000000000..7fa3d841197 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr104505.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +typedef char __attribute__((__vector_size__ (8))) U; +typedef short __attribute__((__vector_size__ (16))) V; + +U u; + +void +foo (V v) +{ + u = __builtin_shufflevector (u, u, __builtin_convertvector (v, U)); /* { dg-error "invalid element index" } */ +}