]> granicus.if.org Git - clang/commit
Rework base and member initialization in constructors, with several
authorDouglas Gregor <dgregor@apple.com>
Sun, 31 Jan 2010 09:12:51 +0000 (09:12 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 31 Jan 2010 09:12:51 +0000 (09:12 +0000)
commit9db7dbb918ca49f4ee6c181e4917e7b6ec547353
treeca2970a7b2115f226131005dc0c162108fc18720
parenta05315436746963c4034555ca725956507e14553
Rework base and member initialization in constructors, with several
(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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94952 91177308-0d34-0410-b5e6-96231b3b80d8
22 files changed:
include/clang/AST/DeclCXX.h
include/clang/AST/ExprCXX.h
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Parse/Action.h
lib/AST/DeclCXX.cpp
lib/AST/DeclPrinter.cpp
lib/AST/ExprCXX.cpp
lib/CodeGen/CGClass.cpp
lib/CodeGen/CGExprCXX.cpp
lib/Parse/ParseDeclCXX.cpp
lib/Sema/Sema.h
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaInit.cpp
lib/Sema/SemaInit.h
lib/Sema/SemaTemplateInstantiateDecl.cpp
test/CXX/dcl.decl/dcl.init/p6.cpp [new file with mode: 0644]
test/SemaCXX/constructor-initializer.cpp
test/SemaCXX/copy-assignment.cpp
test/SemaCXX/illegal-member-initialization.cpp
test/SemaCXX/overload-member-call.cpp
test/SemaCXX/overloaded-operator.cpp
test/SemaTemplate/instantiate-member-initializers.cpp