aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2019-04-14 22:56:45 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2019-04-14 20:56:45 +0000
commitd2a0371d2641e85c5e6ca396029be32204d976df (patch)
treefb74dc5db596afc26879acc34a23a9f9156a6f86 /gcc
parentceae614e1debf582340fe73ca350db93966b24bb (diff)
downloadgcc-d2a0371d2641e85c5e6ca396029be32204d976df.zip
gcc-d2a0371d2641e85c5e6ca396029be32204d976df.tar.gz
gcc-d2a0371d2641e85c5e6ca396029be32204d976df.tar.bz2
re PR lto/89358 (Combining -std=c++14 and -std=c++17 objects gives ODR warnings)
PR lto/89358 * g++.dg/lto/pr89358_0.C: New testcase. * g++.dg/lto/pr89358_1.C: New testcase. * ipa-devirt.c (skip_in_fields_list_p): New. (odr_types_equivalent_p): Use it. From-SVN: r270355
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-devirt.c22
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/lto/pr89358_0.C11
-rw-r--r--gcc/testsuite/g++.dg/lto/pr89358_1.C7
5 files changed, 50 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6a394b8..a41417b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-14 Jan Hubicka <hubicka@ucw.cz>
+
+ PR lto/89358
+ * ipa-devirt.c (skip_in_fields_list_p): New.
+ (odr_types_equivalent_p): Use it.
+
2019-04-13 Jakub Jelinek <jakub@redhat.com>
PR target/89093
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 61e4efc..defa2ed 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -1282,6 +1282,24 @@ warn_types_mismatch (tree t1, tree t2, location_t loc1, location_t loc2)
inform (loc_t2, "the incompatible type is defined here");
}
+/* Return true if T should be ignored in TYPE_FIELDS for ODR comparsion. */
+
+static bool
+skip_in_fields_list_p (tree t)
+{
+ if (TREE_CODE (t) != FIELD_DECL)
+ return true;
+ /* C++ FE introduces zero sized fields depending on -std setting, see
+ PR89358. */
+ if (DECL_SIZE (t)
+ && integer_zerop (DECL_SIZE (t))
+ && DECL_ARTIFICIAL (t)
+ && DECL_IGNORED_P (t)
+ && !DECL_NAME (t))
+ return true;
+ return false;
+}
+
/* Compare T1 and T2, report ODR violations if WARN is true and set
WARNED to true if anything is reported. Return true if types match.
If true is returned, the types are also compatible in the sense of
@@ -1548,9 +1566,9 @@ odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned,
f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
{
/* Skip non-fields. */
- while (f1 && TREE_CODE (f1) != FIELD_DECL)
+ while (f1 && skip_in_fields_list_p (f1))
f1 = TREE_CHAIN (f1);
- while (f2 && TREE_CODE (f2) != FIELD_DECL)
+ while (f2 && skip_in_fields_list_p (f2))
f2 = TREE_CHAIN (f2);
if (!f1 || !f2)
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0c4ae15..8055780 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-14 Jan Hubicka <hubicka@ucw.cz>
+
+ PR lto/89358
+ * g++.dg/lto/pr89358_0.C: New testcase.
+ * g++.dg/lto/pr89358_1.C: New testcase.
+
2019-04-14 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85448
diff --git a/gcc/testsuite/g++.dg/lto/pr89358_0.C b/gcc/testsuite/g++.dg/lto/pr89358_0.C
new file mode 100644
index 0000000..aebd212
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr89358_0.C
@@ -0,0 +1,11 @@
+/* { dg-do link } */
+/* { dg-options "-std=c++17" } */
+#include <map>
+
+extern void test();
+
+int main()
+{
+ std::map<int, int> m;
+ test();
+}
diff --git a/gcc/testsuite/g++.dg/lto/pr89358_1.C b/gcc/testsuite/g++.dg/lto/pr89358_1.C
new file mode 100644
index 0000000..68b80a3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr89358_1.C
@@ -0,0 +1,7 @@
+/* { dg-options "-std=c++14" } */
+#include <map>
+
+void test()
+{
+ std::map<int, int> m;
+}