Skip to content
  • Richard Smith's avatar
    P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991: · 5be817d9
    Richard Smith authored
    Replace inheriting constructors implementation with new approach, voted into
    C++ last year as a DR against C++11.
    
    Instead of synthesizing a set of derived class constructors for each inherited
    base class constructor, we make the constructors of the base class visible to
    constructor lookup in the derived class, using the normal rules for
    using-declarations.
    
    For constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived
    class that tracks the requisite additional information. We create shadow
    constructors (not found by name lookup) in the derived class to model the
    actual initialization, and have a new expression node,
    CXXInheritedCtorInitExpr, to model the initialization of a base class from such
    a constructor. (This initialization is special because it performs real perfect
    forwarding of arguments.)
    
    In cases where argument forwarding is not possible (for inalloca calls,
    variadic calls, and calls with callee parameter cleanup), the shadow inheriting
    constructor is not emitted and instead we directly emit the initialization code
    into the caller of the inherited constructor.
    
    Note that this new model is not perfectly compatible with the old model in some
    corner cases. In particular:
     * if B inherits a private constructor from A, and C uses that constructor to
       construct a B, then we previously required that A befriends B and B
       befriends C, but the new rules require A to befriend C directly, and
     * if a derived class has its own constructors (and so its implicit default
       constructor is suppressed), it may still inherit a default constructor from
       a base class
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274049 91177308-0d34-0410-b5e6-96231b3b80d8
    5be817d9