diff options
author | Jason Merrill <jason@redhat.com> | 2018-05-10 14:57:55 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-05-10 14:57:55 -0400 |
commit | f8e94a0156bb869e3b82ca063054ab052a72827b (patch) | |
tree | 14d1c41829180b70b52b834aa6a1fbe4954b8ecb | |
parent | d86d6e27db4520249273fbd65e809036999f96f4 (diff) | |
download | gcc-f8e94a0156bb869e3b82ca063054ab052a72827b.zip gcc-f8e94a0156bb869e3b82ca063054ab052a72827b.tar.gz gcc-f8e94a0156bb869e3b82ca063054ab052a72827b.tar.bz2 |
Core issue 2310 - conversion to base of incomplete type.
* class.c (build_base_path): Check COMPLETE_TYPE_P for source type.
From-SVN: r260127
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/class.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-base6.C | 14 |
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; +}; |