From 16225110ca8ae760f001c57571fa7e7e03c2c1fc Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 2 Mar 2018 17:19:43 +0100 Subject: [PATCH] re PR ipa/84628 (attribute(warning/error) functions should not be merged together) PR ipa/84628 * expr.c (expand_expr_real_1) : Don't emit diagnostics for error or warning attributes if CALL_FROM_THUNK_P is set. Formatting fixes. * gcc.dg/pr84628.c: New test. Co-Authored-By: Richard Biener From-SVN: r258140 --- gcc/ChangeLog | 8 ++++++++ gcc/expr.c | 26 +++++++++++++++++++------- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/pr84628.c | 8 ++++++++ 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr84628.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a2263edadb6..447d56342f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-03-02 Jakub Jelinek + Richard Biener + + PR ipa/84628 + * expr.c (expand_expr_real_1) : Don't emit diagnostics + for error or warning attributes if CALL_FROM_THUNK_P is set. + Formatting fixes. + 2018-03-02 Jakub Jelinek PR target/56540 diff --git a/gcc/expr.c b/gcc/expr.c index 876883e4374..00660293f72 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10963,18 +10963,30 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, tree fndecl = get_callee_fndecl (exp), attr; if (fndecl + /* Don't diagnose the error attribute in thunks, those are + artificially created. */ + && !CALL_FROM_THUNK_P (exp) && (attr = lookup_attribute ("error", DECL_ATTRIBUTES (fndecl))) != NULL) - error ("%Kcall to %qs declared with attribute error: %s", - exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)), - TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); + { + const char *ident = lang_hooks.decl_printable_name (fndecl, 1); + error ("%Kcall to %qs declared with attribute error: %s", exp, + identifier_to_locale (ident), + TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); + } if (fndecl + /* Don't diagnose the warning attribute in thunks, those are + artificially created. */ + && !CALL_FROM_THUNK_P (exp) && (attr = lookup_attribute ("warning", DECL_ATTRIBUTES (fndecl))) != NULL) - warning_at (tree_nonartificial_location (exp), - 0, "%Kcall to %qs declared with attribute warning: %s", - exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)), - TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); + { + const char *ident = lang_hooks.decl_printable_name (fndecl, 1); + warning_at (tree_nonartificial_location (exp), 0, + "%Kcall to %qs declared with attribute warning: %s", + exp, identifier_to_locale (ident), + TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); + } /* Check for a built-in function. */ if (fndecl && DECL_BUILT_IN (fndecl)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67eefea359b..84ebf2e694c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-03-02 Jakub Jelinek + PR ipa/84628 + * gcc.dg/pr84628.c: New test. + PR target/56540 * gcc.target/ia64/pr56540.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr84628.c b/gcc/testsuite/gcc.dg/pr84628.c new file mode 100644 index 00000000000..b8eb53c7dc0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr84628.c @@ -0,0 +1,8 @@ +/* PR ipa/84628 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int f0 (void); +__attribute__((error ("err"))) void f1 (void) { f0 (); f0 (); } +__attribute__((error ("err"))) void f2 (void) { f0 (); f0 (); } +/* { dg-bogus "declared with attribute error" "" { target *-*-* } 0 } */ -- 2.30.2