summaryrefslogtreecommitdiff
path: root/gcc/ipa-devirt.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2018-11-17 12:35:01 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2018-11-17 11:35:01 +0000
commitba1677480a6974a693c8b4136b4a0bc52e19d551 (patch)
treefa4f187a086189c2de819c1fc63b1fe07665d54d /gcc/ipa-devirt.c
parentd7815fc4509e0caf04c4b43de89b20ac57504307 (diff)
re PR ipa/87957 (ICE tree check: expected tree that contains ‘decl minimal’ structure, have ‘identifier_node’ in warn_odr, at ipa-devirt.c:1051 since r265519)
PR ipa/87957 * ipa-devirt.c (warn_odr): Look for main variant to get TYPE_DECL. From-SVN: r266235
Diffstat (limited to 'gcc/ipa-devirt.c')
-rw-r--r--gcc/ipa-devirt.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 4676bdbdf93..db8d34c4027 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -1000,11 +1000,11 @@ static void
warn_odr (tree t1, tree t2, tree st1, tree st2,
bool warn, bool *warned, const char *reason)
{
- tree decl2 = TYPE_NAME (t2);
+ tree decl2 = TYPE_NAME (TYPE_MAIN_VARIANT (t2));
if (warned)
*warned = false;
- if (!warn || !TYPE_NAME(t1))
+ if (!warn || !TYPE_NAME(TYPE_MAIN_VARIANT (t1)))
return;
/* ODR warnings are output druing LTO streaming; we must apply location
@@ -1013,10 +1013,22 @@ warn_odr (tree t1, tree t2, tree st1, tree st2,
lto_location_cache::current_cache->apply_location_cache ();
auto_diagnostic_group d;
- if (!warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (t1)), OPT_Wodr,
- "type %qT violates the C++ One Definition Rule",
- t1))
- return;
+ if (t1 != TYPE_MAIN_VARIANT (t1)
+ && TYPE_NAME (t1) != DECL_NAME (TYPE_MAIN_VARIANT (t1)))
+ {
+ if (!warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (TYPE_MAIN_VARIANT (t1))),
+ OPT_Wodr, "type %qT (typedef of %qT) violates the "
+ "C++ One Definition Rule",
+ t1, TYPE_MAIN_VARIANT (t1)))
+ return;
+ }
+ else
+ {
+ if (!warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (TYPE_MAIN_VARIANT (t1))),
+ OPT_Wodr, "type %qT violates the C++ One Definition Rule",
+ t1))
+ return;
+ }
if (!st1 && !st2)
;
/* For FIELD_DECL support also case where one of fields is