summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2013-02-03 23:02:47 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2013-02-03 23:02:47 +0000
commitb614fab39dcf101ec9c87bf84b0c75a3e43e7cfe (patch)
tree91b7a51fec0d5868e5ee479ffc941a3c3fe7c5ca
parent4c4ffd7783970e0dee30722602c95a02e6e5c5c0 (diff)
downloadbcm5719-llvm-b614fab39dcf101ec9c87bf84b0c75a3e43e7cfe.tar.gz
bcm5719-llvm-b614fab39dcf101ec9c87bf84b0c75a3e43e7cfe.zip
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(); llvm-svn: 174296
-rw-r--r--clang/lib/AST/DeclPrinter.cpp3
-rw-r--r--clang/test/SemaCXX/ast-print.cpp17
2 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp
index f863bb49d57..333e321d407 100644
--- a/clang/lib/AST/DeclPrinter.cpp
+++ b/clang/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/clang/test/SemaCXX/ast-print.cpp b/clang/test/SemaCXX/ast-print.cpp
index 9ce1f8d5af8..5de8c4b51b9 100644
--- a/clang/test/SemaCXX/ast-print.cpp
+++ b/clang/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));
}
OpenPOWER on IntegriCloud