re PR ipa/87957 (ICE tree check: expected tree that contains ‘decl minimal’ structure...
authorJan Hubicka <hubicka@ucw.cz>
Wed, 21 Nov 2018 17:32:19 +0000 (18:32 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 21 Nov 2018 17:32:19 +0000 (17:32 +0000)
PR lto/87957
* g++.dg/lto/odr-1_0.C: Extend by mismatched enum.
* g++.dg/lto/odr-1_1.C: Extend by mismatched enum.
* g++.dg/lto/odr-2_0.C: New.
* g++.dg/lto/odr-2_0.C: New.
* g++.dg/lto/odr-3_1.C: New.
* g++.dg/lto/odr-3_1.C: New.

From-SVN: r266351

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/odr-1_0.C
gcc/testsuite/g++.dg/lto/odr-1_1.C
gcc/testsuite/g++.dg/lto/odr-2_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/odr-2_1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/odr-3_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/odr-3_1.C [new file with mode: 0644]

index f12fb97..29b0c83 100644 (file)
@@ -1,3 +1,13 @@
+2018-11-21  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR lto/87957
+       * g++.dg/lto/odr-1_0.C: Extend by mismatched enum.
+       * g++.dg/lto/odr-1_1.C: Extend by mismatched enum.
+       * g++.dg/lto/odr-2_0.C: New.
+       * g++.dg/lto/odr-2_0.C: New.
+       * g++.dg/lto/odr-3_1.C: New.
+       * g++.dg/lto/odr-3_1.C: New.
+
 2018-11-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/87839
index 7967e1d..6fff888 100644 (file)
@@ -1,8 +1,11 @@
 // PR c++/82414
 // { dg-lto-do link }
+enum vals {aa,cc}; // { dg-lto-warning "6: type 'vals' violates the C\\+\\+ One Definition Rule" }
 struct a { // { dg-lto-warning "8: type 'struct a' violates the C\\+\\+ One Definition Rule" }
   struct b *ptr; // { dg-lto-message "13: the first difference of corresponding definitions is field 'ptr'" }
+  enum vals vals;
 };
-void test(struct a *)
+void test(struct a *a)
 {
+  a->vals = cc;
 }
index 5cd6f6c..33a13f0 100644 (file)
@@ -1,12 +1,16 @@
 namespace {
-  struct b;
+  struct b; // { dg-lto-message "type 'struct b' defined in anonymous namespace can not match across the translation unit boundary" }
  }
-struct a {
-  struct b *ptr;
-};
+enum vals {aa,bb,cc}; // { dg-lto-message "an enum with different value name is defined in another translation unit" }
+struct a { // { dg-lto-message "a different type is defined in another translation unit" }
+  struct b *ptr; // { dg-lto-message "a field of same name but different type is defined in another translation unit" }
+  enum vals vals;
+} a;
 void test(struct a *);
 int
 main(void)
 {
-  test (0);
+  test (&a);
+  if (a.vals==aa)
+    return 1;
 }
diff --git a/gcc/testsuite/g++.dg/lto/odr-2_0.C b/gcc/testsuite/g++.dg/lto/odr-2_0.C
new file mode 100644 (file)
index 0000000..222fa2c
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -O0 -flto }  } 
+enum a {} b; // { dg-lto-warning "6: type 'a' violates the C\\+\\+ One Definition Rule" }
+int
+main(void)
+{
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/lto/odr-2_1.C b/gcc/testsuite/g++.dg/lto/odr-2_1.C
new file mode 100644 (file)
index 0000000..f384ae8
--- /dev/null
@@ -0,0 +1,4 @@
+class a { // { dg-lto-message "a different type is defined in another translation unit" }
+  int *b() const;
+};
+int *a::b() const { return 0; }
diff --git a/gcc/testsuite/g++.dg/lto/odr-3_0.C b/gcc/testsuite/g++.dg/lto/odr-3_0.C
new file mode 100644 (file)
index 0000000..bfa6c0b
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-lto-do link }
+// { dg-lto-options { -O0 -flto }  } 
+
+typedef struct {
+  int a; // { dg-lto-message "the first difference of corresponding definitions is field 'a'" }
+} YYSTYPE; // { dg-lto-warning "3: warning: type ‘struct YYSTYPE’ violates the C\\+\\+ One Definition Rule" }
+union yyalloc { // { dg-lto-warning "7: type ‘union yyalloc’ violates the C\\+\\+ One Definition Rule" }
+  short yyss;
+  YYSTYPE yyvs; // { dg-lto-message "the first difference of corresponding definitions is field ‘yyvs’" }
+};
+void b() { yyalloc c; }
+
diff --git a/gcc/testsuite/g++.dg/lto/odr-3_1.C b/gcc/testsuite/g++.dg/lto/odr-3_1.C
new file mode 100644 (file)
index 0000000..8a44486
--- /dev/null
@@ -0,0 +1,9 @@
+typedef struct YYSTYPE { // { dg-lto-message ":16 a different type is defined in another translation unit" }
+} YYSTYPE;
+union yyalloc { 
+  short yyss;
+  YYSTYPE yyvs; // { dg-lto-message "the first difference of corresponding definitions is field ‘yyvs’" }
+
+};
+void a() { yyalloc b; }
+