Skip to content

[BUG] Generated default constructor ignores this's initializer #422

Open
@JohelEGP

Description

@JohelEGP

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, "");
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions