summaryrefslogtreecommitdiffstats
path: root/development/qt-creator-llvm/patches/040_D39957_Honor-TerseOutput-for-constructors.patch
diff options
context:
space:
mode:
Diffstat (limited to 'development/qt-creator-llvm/patches/040_D39957_Honor-TerseOutput-for-constructors.patch')
-rw-r--r--development/qt-creator-llvm/patches/040_D39957_Honor-TerseOutput-for-constructors.patch266
1 files changed, 266 insertions, 0 deletions
diff --git a/development/qt-creator-llvm/patches/040_D39957_Honor-TerseOutput-for-constructors.patch b/development/qt-creator-llvm/patches/040_D39957_Honor-TerseOutput-for-constructors.patch
new file mode 100644
index 0000000000..a2d096cf16
--- /dev/null
+++ b/development/qt-creator-llvm/patches/040_D39957_Honor-TerseOutput-for-constructors.patch
@@ -0,0 +1,266 @@
+--- a/tools/clang/lib/AST/DeclPrinter.cpp
++++ b/tools/clang/lib/AST/DeclPrinter.cpp
+@@ -608,66 +608,69 @@
+ }
+
+ if (CDecl) {
+- bool HasInitializerList = false;
+- for (const auto *BMInitializer : CDecl->inits()) {
+- if (BMInitializer->isInClassMemberInitializer())
+- continue;
+-
+- if (!HasInitializerList) {
+- Proto += " : ";
+- Out << Proto;
+- Proto.clear();
+- HasInitializerList = true;
+- } else
+- Out << ", ";
++ if (!Policy.TerseOutput) {
++ bool HasInitializerList = false;
++ for (const auto *BMInitializer : CDecl->inits()) {
++ if (BMInitializer->isInClassMemberInitializer())
++ continue;
+
+- if (BMInitializer->isAnyMemberInitializer()) {
+- FieldDecl *FD = BMInitializer->getAnyMember();
+- Out << *FD;
+- } else {
+- Out << QualType(BMInitializer->getBaseClass(), 0).getAsString(Policy);
+- }
+-
+- Out << "(";
+- if (!BMInitializer->getInit()) {
+- // Nothing to print
+- } else {
+- Expr *Init = BMInitializer->getInit();
+- if (ExprWithCleanups *Tmp = dyn_cast<ExprWithCleanups>(Init))
+- Init = Tmp->getSubExpr();
+-
+- Init = Init->IgnoreParens();
+-
+- Expr *SimpleInit = nullptr;
+- Expr **Args = nullptr;
+- unsigned NumArgs = 0;
+- if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
+- Args = ParenList->getExprs();
+- NumArgs = ParenList->getNumExprs();
+- } else if (CXXConstructExpr *Construct
+- = dyn_cast<CXXConstructExpr>(Init)) {
+- Args = Construct->getArgs();
+- NumArgs = Construct->getNumArgs();
++ if (!HasInitializerList) {
++ Proto += " : ";
++ Out << Proto;
++ Proto.clear();
++ HasInitializerList = true;
+ } else
+- SimpleInit = Init;
+-
+- if (SimpleInit)
+- SimpleInit->printPretty(Out, nullptr, Policy, Indentation);
+- else {
+- for (unsigned I = 0; I != NumArgs; ++I) {
+- assert(Args[I] != nullptr && "Expected non-null Expr");
+- if (isa<CXXDefaultArgExpr>(Args[I]))
+- break;
+-
+- if (I)
+- Out << ", ";
+- Args[I]->printPretty(Out, nullptr, Policy, Indentation);
++ Out << ", ";
++
++ if (BMInitializer->isAnyMemberInitializer()) {
++ FieldDecl *FD = BMInitializer->getAnyMember();
++ Out << *FD;
++ } else {
++ Out << QualType(BMInitializer->getBaseClass(), 0)
++ .getAsString(Policy);
++ }
++
++ Out << "(";
++ if (!BMInitializer->getInit()) {
++ // Nothing to print
++ } else {
++ Expr *Init = BMInitializer->getInit();
++ if (ExprWithCleanups *Tmp = dyn_cast<ExprWithCleanups>(Init))
++ Init = Tmp->getSubExpr();
++
++ Init = Init->IgnoreParens();
++
++ Expr *SimpleInit = nullptr;
++ Expr **Args = nullptr;
++ unsigned NumArgs = 0;
++ if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
++ Args = ParenList->getExprs();
++ NumArgs = ParenList->getNumExprs();
++ } else if (CXXConstructExpr *Construct =
++ dyn_cast<CXXConstructExpr>(Init)) {
++ Args = Construct->getArgs();
++ NumArgs = Construct->getNumArgs();
++ } else
++ SimpleInit = Init;
++
++ if (SimpleInit)
++ SimpleInit->printPretty(Out, nullptr, Policy, Indentation);
++ else {
++ for (unsigned I = 0; I != NumArgs; ++I) {
++ assert(Args[I] != nullptr && "Expected non-null Expr");
++ if (isa<CXXDefaultArgExpr>(Args[I]))
++ break;
++
++ if (I)
++ Out << ", ";
++ Args[I]->printPretty(Out, nullptr, Policy, Indentation);
++ }
+ }
+ }
++ Out << ")";
++ if (BMInitializer->isPackExpansion())
++ Out << "...";
+ }
+- Out << ")";
+- if (BMInitializer->isPackExpansion())
+- Out << "...";
+ }
+ } else if (!ConversionDecl && !isa<CXXDestructorDecl>(D)) {
+ if (FT && FT->hasTrailingReturn()) {
+@@ -712,7 +715,7 @@
+ if (D->getBody())
+ D->getBody()->printPretty(Out, nullptr, SubPolicy, Indentation);
+ } else {
+- if (isa<CXXConstructorDecl>(*D))
++ if (!Policy.TerseOutput && isa<CXXConstructorDecl>(*D))
+ Out << " {}";
+ }
+ }
+--- a/tools/clang/test/Index/comment-cplus-decls.cpp
++++ b/tools/clang/test/Index/comment-cplus-decls.cpp
+@@ -46,7 +46,7 @@
+ data* reserved;
+ };
+ // CHECK: <Declaration>class Test {}</Declaration>
+-// CHECK: <Declaration>Test() : reserved(new Test::data()) {}</Declaration>
++// CHECK: <Declaration>Test()</Declaration>
+ // CHECK: <Declaration>unsigned int getID() const</Declaration>
+ // CHECK: <Declaration>~Test(){{( noexcept)?}}</Declaration>
+ // CHECK: <Declaration>Test::data *reserved</Declaration>
+--- a/tools/clang/unittests/AST/DeclPrinterTest.cpp
++++ b/tools/clang/unittests/AST/DeclPrinterTest.cpp
+@@ -31,18 +31,25 @@
+
+ namespace {
+
+-void PrintDecl(raw_ostream &Out, const ASTContext *Context, const Decl *D) {
++using PrintingPolicyModifier = void (*)(PrintingPolicy &policy);
++
++void PrintDecl(raw_ostream &Out, const ASTContext *Context, const Decl *D,
++ PrintingPolicyModifier PolicyModifier) {
+ PrintingPolicy Policy = Context->getPrintingPolicy();
+ Policy.TerseOutput = true;
++ if (PolicyModifier)
++ PolicyModifier(Policy);
+ D->print(Out, Policy, /*Indentation*/ 0, /*PrintInstantiation*/ false);
+ }
+
+ class PrintMatch : public MatchFinder::MatchCallback {
+ SmallString<1024> Printed;
+ unsigned NumFoundDecls;
++ PrintingPolicyModifier PolicyModifier;
+
+ public:
+- PrintMatch() : NumFoundDecls(0) {}
++ PrintMatch(PrintingPolicyModifier PolicyModifier)
++ : NumFoundDecls(0), PolicyModifier(PolicyModifier) {}
+
+ void run(const MatchFinder::MatchResult &Result) override {
+ const Decl *D = Result.Nodes.getNodeAs<Decl>("id");
+@@ -53,7 +60,7 @@
+ return;
+
+ llvm::raw_svector_ostream Out(Printed);
+- PrintDecl(Out, Result.Context, D);
++ PrintDecl(Out, Result.Context, D, PolicyModifier);
+ }
+
+ StringRef getPrinted() const {
+@@ -65,13 +72,12 @@
+ }
+ };
+
+-::testing::AssertionResult PrintedDeclMatches(
+- StringRef Code,
+- const std::vector<std::string> &Args,
+- const DeclarationMatcher &NodeMatch,
+- StringRef ExpectedPrinted,
+- StringRef FileName) {
+- PrintMatch Printer;
++::testing::AssertionResult
++PrintedDeclMatches(StringRef Code, const std::vector<std::string> &Args,
++ const DeclarationMatcher &NodeMatch,
++ StringRef ExpectedPrinted, StringRef FileName,
++ PrintingPolicyModifier PolicyModifier = nullptr) {
++ PrintMatch Printer(PolicyModifier);
+ MatchFinder Finder;
+ Finder.addMatcher(NodeMatch, &Printer);
+ std::unique_ptr<FrontendActionFactory> Factory(
+@@ -109,16 +115,17 @@
+ "input.cc");
+ }
+
+-::testing::AssertionResult PrintedDeclCXX98Matches(
+- StringRef Code,
+- const DeclarationMatcher &NodeMatch,
+- StringRef ExpectedPrinted) {
++::testing::AssertionResult
++PrintedDeclCXX98Matches(StringRef Code, const DeclarationMatcher &NodeMatch,
++ StringRef ExpectedPrinted,
++ PrintingPolicyModifier PolicyModifier = nullptr) {
+ std::vector<std::string> Args(1, "-std=c++98");
+ return PrintedDeclMatches(Code,
+ Args,
+ NodeMatch,
+ ExpectedPrinted,
+- "input.cc");
++ "input.cc",
++ PolicyModifier);
+ }
+
+ ::testing::AssertionResult PrintedDeclCXX11Matches(StringRef Code,
+@@ -478,6 +485,27 @@
+ "A(const A &a, int = 0)"));
+ }
+
++TEST(DeclPrinter, TestCXXConstructorDeclWithMemberInitializer) {
++ ASSERT_TRUE(PrintedDeclCXX98Matches(
++ "struct A {"
++ " int m;"
++ " A() : m(2) {}"
++ "};",
++ cxxConstructorDecl(ofClass(hasName("A"))).bind("id"),
++ "A()"));
++}
++
++TEST(DeclPrinter, TestCXXConstructorDeclWithMemberInitializer_NoTerseOutput) {
++ ASSERT_TRUE(PrintedDeclCXX98Matches(
++ "struct A {"
++ " int m;"
++ " A() : m(2) {}"
++ "};",
++ cxxConstructorDecl(ofClass(hasName("A"))).bind("id"),
++ "A() : m(2) {\n}\n",
++ [](PrintingPolicy &Policy){ Policy.TerseOutput = false; }));
++}
++
+ TEST(DeclPrinter, TestCXXConstructorDecl5) {
+ ASSERT_TRUE(PrintedDeclCXX11Matches(
+ "struct A {"
+@@ -540,7 +568,7 @@
+ " A(T&&... ts) : T(ts)... {}"
+ "};",
+ cxxConstructorDecl(ofClass(hasName("A"))).bind("id"),
+- "A<T...>(T &&...ts) : T(ts)... {}"));
++ "A<T...>(T &&...ts)"));
+ }
+
+ TEST(DeclPrinter, TestCXXDestructorDecl1) {