diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2018-11-17 12:35:01 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2018-11-17 11:35:01 +0000 |
commit | ba1677480a6974a693c8b4136b4a0bc52e19d551 (patch) | |
tree | fa4f187a086189c2de819c1fc63b1fe07665d54d | |
parent | d7815fc4509e0caf04c4b43de89b20ac57504307 (diff) | |
download | gcc-ba1677480a6974a693c8b4136b4a0bc52e19d551.zip gcc-ba1677480a6974a693c8b4136b4a0bc52e19d551.tar.gz gcc-ba1677480a6974a693c8b4136b4a0bc52e19d551.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 24 |
2 files changed, 23 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2fed746..a6097fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-11-16 Jan Hubicka <hubicka@ucw.cz> + + PR ipa/87957 + * ipa-devirt.c (warn_odr): Look for main variant to get TYPE_DECL. + 2018-11-16 Sandra Loosemore <sandra@codesourcery.com> * doc/invoke.texi (Option Summary): Fix whitespace and line diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 4676bdb..db8d34c 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 |