OSDN Git Service

PR c++/27177
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Jun 2006 21:38:54 +0000 (21:38 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Jun 2006 21:38:54 +0000 (21:38 +0000)
* call.c (standard_conversion): Require that the derived type be
complete when performing a derived-to-base conversion.
PR c++/27177
* g++.dg/expr/cast7.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114448 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/expr/cast7.C [new file with mode: 0644]

index f0a8503..c63ad83 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-06  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/27177
+       * call.c (standard_conversion): Require that the derived type be
+       complete when performing a derived-to-base conversion.
+
 2006-06-04  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/27819
index f852c97..db8dd21 100644 (file)
@@ -727,7 +727,19 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
                  that necessitates this conversion is ill-formed.
                  Therefore, we use DERIVED_FROM_P, and do not check
                  access or uniqueness.  */
-              && DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from)))
+              && DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from))
+              /* If FROM is not yet complete, then we must be parsing
+                 the body of a class.  We know what's derived from
+                 what, but we can't actually perform a
+                 derived-to-base conversion.  For example, in:
+
+                    struct D : public B { 
+                       static const int i = sizeof((B*)(D*)0);
+                     };
+
+                  the D*-to-B* conversion is a reinterpret_cast, not a
+                 static_cast.  */
+              && COMPLETE_TYPE_P (TREE_TYPE (from)))
        {
          from =
            cp_build_qualified_type (TREE_TYPE (to),
index dc457d1..0f42204 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-06  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/27177
+       * g++.dg/expr/cast7.C: New test.
+
 2006-06-06  Janis Johnson  <janis187@us.ibm.com>
 
        * lib/gcc-dg.exp (gcc-dg-test-1): Detect and report ICE.
diff --git a/gcc/testsuite/g++.dg/expr/cast7.C b/gcc/testsuite/g++.dg/expr/cast7.C
new file mode 100644 (file)
index 0000000..c948919
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/27177
+
+struct X {};
+
+struct Y : virtual X {};
+struct Z : virtual X {};
+
+struct A : Y, Z {};
+
+struct B : A
+{
+  static const int i = sizeof((Z*)(B*)0);
+};