PATCH: middle-end/17982: [4.0 regression] asm declaration ignored due to conflict with previous rename
H. J. Lu
hjl@lucon.org
Wed Nov 24 02:10:00 GMT 2004
Checking DECL_ASSEMBLER_NAME_SET_P isn't sufficient for rename.
Simply calling DECL_ASSEMBLER_NAME will make DECL_ASSEMBLER_NAME_SET_P
to return TRUE. This patch tries to determine if the assembler name is
the same as the default one before issing a warning.
H.J.
----
2004-11-23 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/17982
* c-pragma.c (maybe_apply_renaming_pragma): Allow
DECL_ASSEMBLER_NAME to be modified if it is the same as the
default one.
--- gcc/c-pragma.c.17982 2004-11-23 16:39:54.831510454 -0800
+++ gcc/c-pragma.c 2004-11-23 17:58:14.391939544 -0800
@@ -476,26 +476,49 @@ maybe_apply_renaming_pragma (tree decl,
but we may warn about a rename that conflicts. */
if (DECL_ASSEMBLER_NAME_SET_P (decl))
{
- const char *oldname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
- oldname = targetm.strip_name_encoding (oldname);
+ tree saved, def;
+ const char *saved_name, *def_name;
- if (asmname && strcmp (TREE_STRING_POINTER (asmname), oldname))
- warning ("asm declaration ignored due to "
- "conflict with previous rename");
-
- /* Take any pending redefine_extname off the list. */
- for (p = &pending_redefine_extname; (t = *p); p = &TREE_CHAIN (t))
- if (DECL_NAME (decl) == TREE_PURPOSE (t))
- {
- /* Only warn if there is a conflict. */
- if (strcmp (IDENTIFIER_POINTER (TREE_VALUE (t)), oldname))
- warning ("#pragma redefine_extname ignored due to "
- "conflict with previous rename");
-
- *p = TREE_CHAIN (t);
- break;
- }
- return 0;
+ /* We allow DECL_ASSEMBLER_NAME to be modified if it is the same
+ as the default one. */
+ saved = DECL_ASSEMBLER_NAME (decl);
+ SET_DECL_ASSEMBLER_NAME (decl, NULL);
+ def = DECL_ASSEMBLER_NAME (decl);
+ SET_DECL_ASSEMBLER_NAME (decl, saved);
+ if (def != saved)
+ {
+ saved_name = IDENTIFIER_POINTER (saved);
+ def_name = IDENTIFIER_POINTER (def);
+ }
+ else
+ {
+ saved_name = NULL;
+ def_name = NULL;
+ }
+
+ if (saved_name != def_name && strcmp (saved_name, def_name))
+ {
+ const char *oldname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+ oldname = targetm.strip_name_encoding (oldname);
+
+ if (asmname && strcmp (TREE_STRING_POINTER (asmname), oldname))
+ warning ("asm declaration ignored due to "
+ "conflict with previous rename");
+
+ /* Take any pending redefine_extname off the list. */
+ for (p = &pending_redefine_extname; (t = *p); p = &TREE_CHAIN (t))
+ if (DECL_NAME (decl) == TREE_PURPOSE (t))
+ {
+ /* Only warn if there is a conflict. */
+ if (strcmp (IDENTIFIER_POINTER (TREE_VALUE (t)), oldname))
+ warning ("#pragma redefine_extname ignored due to "
+ "conflict with previous rename");
+
+ *p = TREE_CHAIN (t);
+ break;
+ }
+ return 0;
+ }
}
/* Find out if we have a pending #pragma redefine_extname. */
More information about the Gcc-patches
mailing list