diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2013-02-03 23:02:47 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2013-02-03 23:02:47 +0000 |
commit | 93aa2db250a0e67192ab2a5417e4dfd5530d6f56 (patch) | |
tree | 05e61d09cfe7569574420bb0d9f8c11b30587ff3 | |
parent | f408d1dc5824223a9bbb65a4bbdb9440d8d7c30e (diff) |
DeclPrinter: fix CXXConstructExpr printing with implicit default argument
This is an improvement of r173630, that handles the following case:
struct VirualDestrClass
{
VirualDestrClass(int arg);
virtual ~VirualDestrClass();
};
struct ConstrWithCleanupsClass
{
ConstrWithCleanupsClass(const VirualDestrClass& cplx = VirualDestrClass(42));
};
ConstrWithCleanupsClass cwcNoArg;
That was printed as:
ConstrWithCleanupsClass cwcNoArg();
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174296 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/DeclPrinter.cpp | 3 | ||||
-rw-r--r-- | test/SemaCXX/ast-print.cpp | 17 |
2 files changed, 19 insertions, 1 deletions
diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp index f863bb49d5..333e321d40 100644 --- a/lib/AST/DeclPrinter.cpp +++ b/lib/AST/DeclPrinter.cpp @@ -649,7 +649,8 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) { Expr *Init = D->getInit(); if (!Policy.SuppressInitializers && Init) { bool ImplicitInit = false; - if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init)) { + if (CXXConstructExpr *Construct = + dyn_cast<CXXConstructExpr>(Init->IgnoreImplicit())) { if (D->getInitStyle() == VarDecl::CallInit && !Construct->isListInitialization()) { ImplicitInit = Construct->getNumArgs() == 0 || diff --git a/test/SemaCXX/ast-print.cpp b/test/SemaCXX/ast-print.cpp index 9ce1f8d5af..5de8c4b51b 100644 --- a/test/SemaCXX/ast-print.cpp +++ b/test/SemaCXX/ast-print.cpp @@ -110,13 +110,30 @@ struct NoArgClass NoArgClass() {} }; +struct VirualDestrClass +{ + VirualDestrClass(int arg); + virtual ~VirualDestrClass(); +}; + +struct ConstrWithCleanupsClass +{ + ConstrWithCleanupsClass(const VirualDestrClass& cplx = VirualDestrClass(42)); +}; + // CHECK: test12 // CHECK-NEXT: DefaultArgClass useDefaultArg; // CHECK-NEXT: DefaultArgClass overrideDefaultArg(1); // CHECK-NEXT: NoArgClass noArg; +// CHECK-NEXT: ConstrWithCleanupsClass cwcNoArg; +// CHECK-NEXT: ConstrWithCleanupsClass cwcOverrideArg(48); +// CHECK-NEXT: ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56)); void test12() { DefaultArgClass useDefaultArg; DefaultArgClass overrideDefaultArg(1); NoArgClass noArg; + ConstrWithCleanupsClass cwcNoArg; + ConstrWithCleanupsClass cwcOverrideArg(48); + ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56)); } |