From f7e26913187ce0ed35e340c4fd14104bbcd1932e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 14 Feb 2022 09:29:20 +0100 Subject: [PATCH] c/104505 - ICE with internal function call in diagnostic expression The following handles internal function calls similar to how the C++ frontend does, avoiding ICEing on those. 2022-02-14 Richard Biener 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. --- gcc/c-family/c-pretty-print.cc | 6 +++++- gcc/testsuite/c-c++-common/pr104505.c | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/pr104505.c diff --git a/gcc/c-family/c-pretty-print.cc b/gcc/c-family/c-pretty-print.cc index ceedaea..dac1775 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 0000000..7fa3d84 --- /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" } */ +} -- 2.7.4