Skip to content
  • Douglas Gregor's avatar
    Rework base and member initialization in constructors, with several · 7ae2d775
    Douglas Gregor authored
    (necessarily simultaneous) changes:
    
      - CXXBaseOrMemberInitializer now contains only a single initializer
        rather than a set of initialiation arguments + a constructor. The
        single initializer covers all aspects of initialization, including
        constructor calls as necessary but also cleanup of temporaries
        created by the initializer (which we never handled
        before!).
    
      - Rework + simplify code generation for CXXBaseOrMemberInitializers,
        since we can now just emit the initializer as an initializer.
    
      - Switched base and member initialization over to the new
        initialization code (InitializationSequence), so that it
    
      - Improved diagnostics for the new initialization code when
        initializing bases and members, to match the diagnostics produced
        by the previous (special-purpose) code.
    
      - Simplify the representation of type-checked constructor initializers in
        templates; instead of keeping the fully-type-checked AST, which is
        rather hard to undo at template instantiation time, throw away the
        type-checked AST and store the raw expressions in the AST. This
        simplifies instantiation, but loses a little but of information in
        the AST.
    
      - When type-checking implicit base or member initializers within a
        dependent context, don't add the generated initializers into the
        AST, because they'll look like they were explicit.
    
      - Record in CXXConstructExpr when the constructor call is to
      initialize a base class, so that CodeGen does not have to infer it
      from context. This ensures that we call the right kind of
      constructor.
    
    There are also a few "opportunity" fixes here that were needed to not
    regress, for example:
    
      - Diagnose default-initialization of a const-qualified class that
        does not have a user-declared default constructor. We had this
        diagnostic specifically for bases and members, but missed it for
        variables. That's fixed now.
    
      - When defining the implicit constructors, destructor, and
        copy-assignment operator, set the CurContext to that constructor
        when we're defining the body.
    
    llvm-svn: 94952
    7ae2d775
Loading