Commit 73b7d28f by Paolo Carlini Committed by Paolo Carlini

re PR c++/83796 (Abstract classes allowed to be instantiated when initialised as…

re PR c++/83796 (Abstract classes allowed to be instantiated when initialised as default parameter to function or constructor)

/cp
2018-02-01  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/83796
	* call.c (convert_like_real): If w're initializing from {} explicitly
	call abstract_virtuals_error_sfinae.

/testsuite
2018-02-01  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/83796
	* g++.dg/cpp0x/abstract-default1.C: New.

From-SVN: r257298
parent 3ae12932
2018-02-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/83796
* call.c (convert_like_real): If w're initializing from {} explicitly
call abstract_virtuals_error_sfinae.
2018-01-31 Jason Merrill <jason@redhat.com> 2018-01-31 Jason Merrill <jason@redhat.com>
Jakub Jelinek <jakub@redhat.com> Jakub Jelinek <jakub@redhat.com>
......
...@@ -6765,6 +6765,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -6765,6 +6765,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
&& TYPE_HAS_DEFAULT_CONSTRUCTOR (totype)) && TYPE_HAS_DEFAULT_CONSTRUCTOR (totype))
{ {
bool direct = CONSTRUCTOR_IS_DIRECT_INIT (expr); bool direct = CONSTRUCTOR_IS_DIRECT_INIT (expr);
if (abstract_virtuals_error_sfinae (NULL_TREE, totype, complain))
return error_mark_node;
expr = build_value_init (totype, complain); expr = build_value_init (totype, complain);
expr = get_target_expr_sfinae (expr, complain); expr = get_target_expr_sfinae (expr, complain);
if (expr != error_mark_node) if (expr != error_mark_node)
......
2018-02-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/83796
* g++.dg/cpp0x/abstract-default1.C: New.
2018-02-01 Richard Sandiford <richard.sandiford@linaro.org> 2018-02-01 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/81635 PR tree-optimization/81635
......
// PR c++/83796
// { dg-do compile { target c++11 } }
struct MyAbstractClass
{
virtual int foo() const = 0;
};
struct TestClass
{
TestClass(const MyAbstractClass& m = {}) // { dg-error "abstract type" }
: value_(m.foo()) {}
int value_;
};
int TestFunction(const MyAbstractClass& m = {}) // { dg-error "abstract type" }
{
return m.foo();
}
int main()
{
TestClass testInstance; // { dg-error "abstract type" }
TestFunction(); // { dg-error "abstract type" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment