if (D->isInlineSpecified()) Out << "inline ";
if (D->isVirtualAsWritten()) Out << "virtual ";
if (D->isModulePrivate()) Out << "__module_private__ ";
+ if (D->isConstexpr() && !D->isExplicitlyDefaulted()) Out << "constexpr ";
if ((CDecl && CDecl->isExplicitSpecified()) ||
(ConversionDecl && ConversionDecl->isExplicit()))
Out << "explicit ";
Proto += " volatile";
if (FT->isRestrict())
Proto += " restrict";
+
+ switch (FT->getRefQualifier()) {
+ case RQ_None:
+ break;
+ case RQ_LValue:
+ Proto += " &";
+ break;
+ case RQ_RValue:
+ Proto += " &&";
+ break;
+ }
}
if (FT && FT->hasDynamicExceptionSpec()) {
}
}
Out << ")";
+ if (BMInitializer->isPackExpansion())
+ Out << "...";
}
- } else if (!ConversionDecl) {
+ } else if (!ConversionDecl && !isa<CXXDestructorDecl>(D)) {
if (FT && FT->hasTrailingReturn()) {
Out << "auto " << Proto << " -> ";
Proto.clear();
// CHECK: <Declaration>class Test {}</Declaration>
// CHECK: <Declaration>Test() : reserved(new Test::data())</Declaration>
// CHECK: <Declaration>unsigned int getID() const</Declaration>
-// CHECK: <Declaration>void ~Test()</Declaration>
+// CHECK: <Declaration>~Test()</Declaration>
// CHECK: <Declaration>Test::data *reserved</Declaration>
/// Aaa.
~comment_to_xml_conversion_01();
-// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:3: CXXDestructor=~comment_to_xml_conversion_01:{{.*}} FullCommentAsXML=[<Function isInstanceMethod="1" file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="3"><Name>~comment_to_xml_conversion_01</Name><USR>c:@C@comment_to_xml_conversion_01@F@~comment_to_xml_conversion_01#</USR><Declaration>void ~comment_to_xml_conversion_01()</Declaration><Abstract><Para> Aaa.</Para></Abstract></Function>]
+// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:3: CXXDestructor=~comment_to_xml_conversion_01:{{.*}} FullCommentAsXML=[<Function isInstanceMethod="1" file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="3"><Name>~comment_to_xml_conversion_01</Name><USR>c:@C@comment_to_xml_conversion_01@F@~comment_to_xml_conversion_01#</USR><Declaration>~comment_to_xml_conversion_01()</Declaration><Abstract><Para> Aaa.</Para></Abstract></Function>]
/// \param aaa Blah blah.
int comment_to_xml_conversion_02(int aaa);
ASSERT_TRUE(PrintedDeclCXX11Matches(
"constexpr int A(int a);",
"A",
- "int A(int a)"));
- // WRONG; Should be: "constexpr int A(int a);"
+ "constexpr int A(int a)"));
+ // Should be: with semicolon
}
TEST(DeclPrinter, TestFunctionDecl8) {
" constexpr A();"
"};",
constructorDecl(ofClass(hasName("A"))).bind("id"),
- "A()"));
- // WRONG; Should be: "constexpr A();"
+ "constexpr A()"));
}
TEST(DeclPrinter, TestCXXConstructorDecl8) {
" A(T&&... ts) : T(ts)... {}"
"};",
constructorDecl(ofClass(hasName("A"))).bind("id"),
- "A<T...>(T &&ts...) : T(ts)"));
- // WRONG; Should be: "A(T&&... ts) : T(ts)..."
+ "A<T...>(T &&ts...) : T(ts)..."));
}
TEST(DeclPrinter, TestCXXDestructorDecl1) {
" ~A();"
"};",
destructorDecl(ofClass(hasName("A"))).bind("id"),
- "void ~A()"));
- // WRONG; Should be: "~A();"
+ "~A()"));
}
TEST(DeclPrinter, TestCXXDestructorDecl2) {
" virtual ~A();"
"};",
destructorDecl(ofClass(hasName("A"))).bind("id"),
- "virtual void ~A()"));
- // WRONG; Should be: "virtual ~A();"
+ "virtual ~A()"));
}
TEST(DeclPrinter, TestCXXConversionDecl1) {
" void A(int a) &;"
"};",
"A",
- "void A(int a)"));
- // WRONG; Should be: "void A(int a) &;"
+ "void A(int a) &"));
+ // Should be: with semicolon
}
TEST(DeclPrinter, TestCXXMethodDecl_RefQualifier2) {
" void A(int a) &&;"
"};",
"A",
- "void A(int a)"));
- // WRONG; Should be: "void A(int a) &&;"
+ "void A(int a) &&"));
+ // Should be: with semicolon
}
TEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification1) {