Open
Description
Title: Generated default constructor ignores this
's initializer.
Minimal reproducer (https://cpp2.godbolt.org/z/sYTsz8q8K):
base: type = {
public x: i32 = -1;
operator=: (out this) = { }
operator=: (out this, y: i32) = x = y;
}
derived: type = {
this: base = 42;
// operator=: (out this) = { }
}
main: () = {
[[assert: derived().x == 42]]
}
Commands:
cppfront -clean-cpp1 main.cpp2
clang++17 -std=c++2b -stdlib=libc++ -lc++abi -I . main.cpp
./a.out
Expected result:
Same as giving derived
the user-written default constructor operator=: (out this) = { }
:
public: derived();
derived::derived()
: base{ 42 }
{}
Program returned: 0
.
Actual result and error:
public: derived() = default;
Program returned: 139
Contract violation
libc++abi: terminating
Cpp2 lowered to Cpp1.
#include "cpp2util.h"
class base;
class derived;
class base {
public: cpp2::i32 x {-1};
public: base();
public: explicit base(cpp2::in<cpp2::i32> y);
public: auto operator=(cpp2::in<cpp2::i32> y) -> base& ;
public: base(base const&) = delete;
public: auto operator=(base const&) -> void = delete;
};
class derived: public base {
public: derived() = default;
public: derived(derived const&) = delete;
public: auto operator=(derived const&) -> void = delete;
// operator=: (out this) = { }
};
auto main() -> int;
base::base(){}
base::base(cpp2::in<cpp2::i32> y)
: x{ y }
{ }
auto base::operator=(cpp2::in<cpp2::i32> y) -> base& {
x = y;
return *this;
}
auto main() -> int{
cpp2::Default.expects(derived().x==42, "");
}