From 39a1ebb3ddb6b2afcc96723b0cb59dbd10be5268 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 13 Mar 2014 21:56:06 +0100 Subject: [PATCH] re PR middle-end/36282 (Spurious warning "asm declaration ignored due to conflict with previous rename") PR middle-end/36282 * c-pragma.c (apply_pragma_weak): Only look at TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) if DECL_ASSEMBLER_NAME_SET_P (decl). (maybe_apply_pending_pragma_weaks): Exit early if vec_safe_is_empty (pending_weaks) rather than only when !pending_weaks. (maybe_apply_pragma_weak): Likewise. If !DECL_ASSEMBLER_NAME_SET_P, set assembler name back to NULL afterwards. * c-c++-common/pr36282-1.c: New test. * c-c++-common/pr36282-2.c: New test. * c-c++-common/pr36282-3.c: New test. * c-c++-common/pr36282-4.c: New test. From-SVN: r208557 --- gcc/c-family/ChangeLog | 12 ++++++++++++ gcc/c-family/c-pragma.c | 13 ++++++++++--- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/c-c++-common/pr36282-1.c | 12 ++++++++++++ gcc/testsuite/c-c++-common/pr36282-2.c | 10 ++++++++++ gcc/testsuite/c-c++-common/pr36282-3.c | 13 +++++++++++++ gcc/testsuite/c-c++-common/pr36282-4.c | 13 +++++++++++++ 7 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr36282-1.c create mode 100644 gcc/testsuite/c-c++-common/pr36282-2.c create mode 100644 gcc/testsuite/c-c++-common/pr36282-3.c create mode 100644 gcc/testsuite/c-c++-common/pr36282-4.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index e149e60d5ec..4e5aea46841 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,15 @@ +2014-03-13 Jakub Jelinek + + PR middle-end/36282 + * c-pragma.c (apply_pragma_weak): Only look at + TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) if + DECL_ASSEMBLER_NAME_SET_P (decl). + (maybe_apply_pending_pragma_weaks): Exit early if + vec_safe_is_empty (pending_weaks) rather than only when + !pending_weaks. + (maybe_apply_pragma_weak): Likewise. If !DECL_ASSEMBLER_NAME_SET_P, + set assembler name back to NULL afterwards. + 2014-03-11 Jason Merrill * c.opt: Add -std=gnu++14. diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index 2594d73a216..9e2a00eb16e 100644 --- a/gcc/c-family/c-pragma.c +++ b/gcc/c-family/c-pragma.c @@ -263,6 +263,7 @@ apply_pragma_weak (tree decl, tree value) if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl) && !DECL_WEAK (decl) /* Don't complain about a redundant #pragma. */ + && DECL_ASSEMBLER_NAME_SET_P (decl) && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) warning (OPT_Wpragmas, "applying #pragma weak %q+D after first use " "results in unspecified behavior", decl); @@ -280,7 +281,7 @@ maybe_apply_pragma_weak (tree decl) /* Avoid asking for DECL_ASSEMBLER_NAME when it's not needed. */ /* No weak symbols pending, take the short-cut. */ - if (!pending_weaks) + if (vec_safe_is_empty (pending_weaks)) return; /* If it's not visible outside this file, it doesn't matter whether it's weak. */ @@ -292,7 +293,13 @@ maybe_apply_pragma_weak (tree decl) if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL) return; - id = DECL_ASSEMBLER_NAME (decl); + if (DECL_ASSEMBLER_NAME_SET_P (decl)) + id = DECL_ASSEMBLER_NAME (decl); + else + { + id = DECL_ASSEMBLER_NAME (decl); + SET_DECL_ASSEMBLER_NAME (decl, NULL_TREE); + } FOR_EACH_VEC_ELT (*pending_weaks, i, pe) if (id == pe->name) @@ -313,7 +320,7 @@ maybe_apply_pending_pragma_weaks (void) pending_weak *pe; symtab_node *target; - if (!pending_weaks) + if (vec_safe_is_empty (pending_weaks)) return; FOR_EACH_VEC_ELT (*pending_weaks, i, pe) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d5f33a79cc2..3df9dbb1ed1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-03-13 Jakub Jelinek + + PR middle-end/36282 + * c-c++-common/pr36282-1.c: New test. + * c-c++-common/pr36282-2.c: New test. + * c-c++-common/pr36282-3.c: New test. + * c-c++-common/pr36282-4.c: New test. + 2014-03-13 Richard Henderson PR debug/60438 diff --git a/gcc/testsuite/c-c++-common/pr36282-1.c b/gcc/testsuite/c-c++-common/pr36282-1.c new file mode 100644 index 00000000000..abe11e7ec7f --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr36282-1.c @@ -0,0 +1,12 @@ +/* PR middle-end/36282 */ +/* { dg-do compile } */ + +#pragma weak bar + +extern void *baz (void *dest, const void *src, __SIZE_TYPE__ n); +extern __typeof (baz) baz __asm("bazfn"); /* { dg-bogus "asm declaration ignored due to conflict with previous rename" } */ + +void +foo (void) +{ +} diff --git a/gcc/testsuite/c-c++-common/pr36282-2.c b/gcc/testsuite/c-c++-common/pr36282-2.c new file mode 100644 index 00000000000..86d3ad657a3 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr36282-2.c @@ -0,0 +1,10 @@ +/* PR middle-end/36282 */ +/* { dg-do compile } */ + +extern void *baz (void *dest, const void *src, __SIZE_TYPE__ n); +extern __typeof (baz) baz __asm("bazfn"); /* { dg-bogus "asm declaration ignored due to conflict with previous rename" } */ + +void +foo (void) +{ +} diff --git a/gcc/testsuite/c-c++-common/pr36282-3.c b/gcc/testsuite/c-c++-common/pr36282-3.c new file mode 100644 index 00000000000..8982470c090 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr36282-3.c @@ -0,0 +1,13 @@ +/* PR middle-end/36282 */ +/* { dg-do compile } */ + +void bar (void); +#pragma weak bar + +extern void *baz (void *dest, const void *src, __SIZE_TYPE__ n); +extern __typeof (baz) baz __asm("bazfn"); /* { dg-bogus "asm declaration ignored due to conflict with previous rename" } */ + +void +foo (void) +{ +} diff --git a/gcc/testsuite/c-c++-common/pr36282-4.c b/gcc/testsuite/c-c++-common/pr36282-4.c new file mode 100644 index 00000000000..f6f40f8e4aa --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr36282-4.c @@ -0,0 +1,13 @@ +/* PR middle-end/36282 */ +/* { dg-do compile } */ + +#pragma weak bar +void bar (void); + +extern void *baz (void *dest, const void *src, __SIZE_TYPE__ n); +extern __typeof (baz) baz __asm("bazfn"); /* { dg-bogus "asm declaration ignored due to conflict with previous rename" } */ + +void +foo (void) +{ +}