aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2013-01-27 21:28:24 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2013-01-27 21:28:24 +0000
commit5250e2b24f7288fb31dc6357831fcbc4ced26693 (patch)
tree92e3607770025f2bb05b757b545fbc4c073332cc
parentd1e5c0df2acb01192eedda14534fe990e1e26c46 (diff)
Decl printer: fix CXXConstructExpr with implicit default argument
Patch by Will Wilson. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173630 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/DeclPrinter.cpp10
-rw-r--r--test/SemaCXX/ast-print.cpp21
2 files changed, 28 insertions, 3 deletions
diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp
index b4005221f4..6057f60136 100644
--- a/lib/AST/DeclPrinter.cpp
+++ b/lib/AST/DeclPrinter.cpp
@@ -646,9 +646,13 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
Expr *Init = D->getInit();
if (!Policy.SuppressInitializers && Init) {
bool ImplicitInit = false;
- if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init))
- ImplicitInit = D->getInitStyle() == VarDecl::CallInit &&
- Construct->getNumArgs() == 0 && !Construct->isListInitialization();
+ if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init)) {
+ if (D->getInitStyle() == VarDecl::CallInit &&
+ !Construct->isListInitialization()) {
+ ImplicitInit = Construct->getNumArgs() == 0 ||
+ Construct->getArg(0)->isDefaultArgument();
+ }
+ }
if (!ImplicitInit) {
if ((D->getInitStyle() == VarDecl::CallInit) && !isa<ParenListExpr>(Init))
Out << "(";
diff --git a/test/SemaCXX/ast-print.cpp b/test/SemaCXX/ast-print.cpp
index d41c347620..9ce1f8d5af 100644
--- a/test/SemaCXX/ast-print.cpp
+++ b/test/SemaCXX/ast-print.cpp
@@ -99,3 +99,24 @@ int test11() {
return test10::M::X<INT>::value;
}
+
+struct DefaultArgClass
+{
+ DefaultArgClass(int a = 1) {}
+};
+
+struct NoArgClass
+{
+ NoArgClass() {}
+};
+
+// CHECK: test12
+// CHECK-NEXT: DefaultArgClass useDefaultArg;
+// CHECK-NEXT: DefaultArgClass overrideDefaultArg(1);
+// CHECK-NEXT: NoArgClass noArg;
+void test12() {
+ DefaultArgClass useDefaultArg;
+ DefaultArgClass overrideDefaultArg(1);
+ NoArgClass noArg;
+}
+