c-ada-spec.c (is_tagged_type): Test for TYPE_METHODS on main variant.
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 31 May 2015 21:47:28 +0000 (21:47 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 31 May 2015 21:47:28 +0000 (21:47 +0000)
* c-ada-spec.c (is_tagged_type): Test for TYPE_METHODS on main variant.
(has_nontrivial_methods): Likewise.

From-SVN: r223905

gcc/c-family/ChangeLog
gcc/c-family/c-ada-spec.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/dump-ada-spec-4.C [new file with mode: 0644]

index df874d6d23186442c10ed91baa130a07ffbb482d..abcc2a746744fbc492882893a353481c4811151c 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * c-ada-spec.c (is_tagged_type): Test for TYPE_METHODS on main variant.
+       (has_nontrivial_methods): Likewise.
+
 2015-05-25  Marek Polacek  <polacek@redhat.com>
 
        * c-ubsan.c (ubsan_instrument_shift): Use type0.
index b4e159e1eea07ec7de6309f0f05644911aa8a9e0..9bef52256c7bfa2b1a8378e31ed6681639b80413 100644 (file)
@@ -960,6 +960,9 @@ is_tagged_type (const_tree type)
   if (!type || !RECORD_OR_UNION_TYPE_P (type))
     return false;
 
+  /* TYPE_METHODS is only set on the main variant.  */
+  type = TYPE_MAIN_VARIANT (type);
+
   for (tmp = TYPE_METHODS (type); tmp; tmp = TREE_CHAIN (tmp))
     if (TREE_CODE (tmp) == FUNCTION_DECL && DECL_VINDEX (tmp))
       return true;
@@ -988,6 +991,9 @@ has_nontrivial_methods (tree type)
   if (!cpp_check (type, IS_TRIVIAL))
     return true;
 
+  /* TYPE_METHODS is only set on the main variant.  */
+  type = TYPE_MAIN_VARIANT (type);
+
   /* If there are user-defined methods, they are deemed non-trivial.  */
   for (tmp = TYPE_METHODS (type); tmp; tmp = TREE_CHAIN (tmp))
     if (!DECL_ARTIFICIAL (tmp))
index 45ae35b0766ea7d568bbfec47e73509b41a53c44..7d9e46da773a6a08acef568c83e046fc06fa3940 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+         * g++.dg/other/dump-ada-spec-4.C: New test.
+
 2015-05-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.dg/alias-8.c: Fix dg-warning.
diff --git a/gcc/testsuite/g++.dg/other/dump-ada-spec-4.C b/gcc/testsuite/g++.dg/other/dump-ada-spec-4.C
new file mode 100644 (file)
index 0000000..bdbbda4
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-ada-spec" } */
+
+class Root  {
+public:
+   virtual void copyFrom(const Root& property) = 0;
+};
+
+class DT : Root {
+   virtual void copyFrom (const Root& property);
+   /* Although in C++ the type of argument Root is the parent type
+      "Root", in order to properly override this primitive in Ada
+      the profile of the generated function must be the derived
+      type "DT" */
+};
+
+/* { dg-final { scan-ada-spec "Root'Class" } } */
+/* { dg-final { cleanup-ada-spec } } */