diff options
author | Alexis Hunt <alercah@gmail.com> | 2011-05-01 07:04:31 +0000 |
---|---|---|
committer | Alexis Hunt <alercah@gmail.com> | 2011-05-01 07:04:31 +0000 |
commit | 61bc17378432d86b27bc7b565195f111aedab965 (patch) | |
tree | 1dec24380de83c8767d505a7c4416c730e09446c /clang/lib/CodeGen/CGExprCXX.cpp | |
parent | 8e172c60542d18dc72f901374053f04e247c1d68 (diff) | |
download | bcm5719-llvm-61bc17378432d86b27bc7b565195f111aedab965.tar.gz bcm5719-llvm-61bc17378432d86b27bc7b565195f111aedab965.zip |
Fully implement delegating constructors!
As far as I know, this implementation is complete but might be missing a
few optimizations. Exceptions and virtual bases are handled correctly.
Because I'm an optimist, the web page has appropriately been updated. If
I'm wrong, feel free to downgrade its support categories.
llvm-svn: 130642
Diffstat (limited to 'clang/lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 2f3e4680a79..e66afc6290c 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -404,9 +404,16 @@ CodeGenFunction::EmitCXXConstructExpr(const CXXConstructExpr *E, E->arg_begin(), E->arg_end()); } else { - CXXCtorType Type = - (E->getConstructionKind() == CXXConstructExpr::CK_Complete) - ? Ctor_Complete : Ctor_Base; + CXXCtorType Type; + CXXConstructExpr::ConstructionKind K = E->getConstructionKind(); + if (K == CXXConstructExpr::CK_Delegating) { + // We should be emitting a constructor; GlobalDecl will assert this + Type = CurGD.getCtorType(); + } else { + Type = (E->getConstructionKind() == CXXConstructExpr::CK_Complete) + ? Ctor_Complete : Ctor_Base; + } + bool ForVirtualBase = E->getConstructionKind() == CXXConstructExpr::CK_VirtualBase; |