aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/class.c9
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-base6.C14
3 files changed, 26 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e6223ae..2b9ceb2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2018-05-09 Jason Merrill <jason@redhat.com>
+ Core issue 2310 - conversion to base of incomplete type.
+ * class.c (build_base_path): Check COMPLETE_TYPE_P for source type.
+
CWG 2267 - list-initialization of reference temporary
* call.c (reference_binding): List-initializing a reference
temporary is copy-list-initialization.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 30323f0..4616d8d 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -370,6 +370,15 @@ build_base_path (enum tree_code code,
goto indout;
}
+ if (!COMPLETE_TYPE_P (probe))
+ {
+ if (complain & tf_error)
+ error ("cannot convert from %qT to base class %qT because %qT is "
+ "incomplete", BINFO_TYPE (d_binfo), BINFO_TYPE (binfo),
+ BINFO_TYPE (d_binfo));
+ return error_mark_node;
+ }
+
/* If we're in an NSDMI, we don't have the full constructor context yet
that we need for converting to a virtual base, so just build a stub
CONVERT_EXPR and expand it later in bot_replace. */
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base6.C
new file mode 100644
index 0000000..849ac81
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base6.C
@@ -0,0 +1,14 @@
+// CWG issue 2310
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename A, typename B> struct check_derived_from {
+ static A a;
+ static constexpr B *p = &a; // { dg-error "" }
+ int ar[p-p+1];
+};
+struct W { int i; };
+struct Z : W
+{
+ check_derived_from<Z, W> cdf;
+};