149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko//===- unittests/AST/DeclPrinterTest.cpp --- Declaration printer tests ----===// 249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// The LLVM Compiler Infrastructure 449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// This file is distributed under the University of Illinois Open Source 649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// License. See LICENSE.TXT for details. 749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko//===----------------------------------------------------------------------===// 949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 1049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// This file contains tests for Decl::print() and related methods. 1149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 1249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// Search this file for WRONG to see test cases that are producing something 1349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// completely wrong, invalid C++ or just misleading. 1449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 1549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// These tests have a coding convention: 1649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// * declaration to be printed is named 'A' unless it should have some special 1749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// name (e.g., 'operator+'); 1849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// * additional helper declarations are 'Z', 'Y', 'X' and so on. 1949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko// 2049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko//===----------------------------------------------------------------------===// 2149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 2249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko#include "clang/AST/ASTContext.h" 2349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko#include "clang/ASTMatchers/ASTMatchFinder.h" 2449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko#include "clang/Tooling/Tooling.h" 257fd90b03a28df0626fdb44d05be9ddcdb2562686Daniel Jasper#include "llvm/ADT/SmallString.h" 2649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko#include "gtest/gtest.h" 2749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 2849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkousing namespace clang; 2949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkousing namespace ast_matchers; 3049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkousing namespace tooling; 3149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkonamespace { 3349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkovoid PrintDecl(raw_ostream &Out, const ASTContext *Context, const Decl *D) { 3549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko PrintingPolicy Policy = Context->getPrintingPolicy(); 36d1fc82efd53ffda30f4f16041399d78f3bf0705fDmitri Gribenko Policy.TerseOutput = true; 3749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko D->print(Out, Policy, /*Indentation*/ 0, /*PrintInstantiation*/ false); 3849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 3949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkoclass PrintMatch : public MatchFinder::MatchCallback { 4149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<1024> Printed; 4249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko unsigned NumFoundDecls; 4349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenkopublic: 4549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko PrintMatch() : NumFoundDecls(0) {} 4649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko virtual void run(const MatchFinder::MatchResult &Result) { 4849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const Decl *D = Result.Nodes.getDeclAs<Decl>("id"); 4949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (!D || D->isImplicit()) 5049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return; 5149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko NumFoundDecls++; 5249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (NumFoundDecls > 1) 5349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return; 5449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 5549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko llvm::raw_svector_ostream Out(Printed); 5649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko PrintDecl(Out, Result.Context, D); 5749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 5849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 5949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef getPrinted() const { 6049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return Printed; 6149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 6249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 6349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko unsigned getNumFoundDecls() const { 6449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return NumFoundDecls; 6549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 6649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko}; 6749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 6849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko::testing::AssertionResult PrintedDeclMatches( 6949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef Code, 70976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko const std::vector<std::string> &Args, 7149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const DeclarationMatcher &NodeMatch, 7249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 7349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko PrintMatch Printer; 7449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko MatchFinder Finder; 7549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Finder.addMatcher(NodeMatch, &Printer); 7649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko OwningPtr<FrontendActionFactory> Factory(newFrontendActionFactory(&Finder)); 7749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 78976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko if (!runToolOnCodeWithArgs(Factory->create(), Code, Args)) 7949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return testing::AssertionFailure() << "Parsing error in \"" << Code << "\""; 8049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 8149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (Printer.getNumFoundDecls() == 0) 8249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return testing::AssertionFailure() 8349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko << "Matcher didn't find any declarations"; 8449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 8549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (Printer.getNumFoundDecls() > 1) 8649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return testing::AssertionFailure() 8749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko << "Matcher should match only one declaration " 8849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "(found " << Printer.getNumFoundDecls() << ")"; 8949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 9049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (Printer.getPrinted() != ExpectedPrinted) 9149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return ::testing::AssertionFailure() 9249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko << "Expected \"" << ExpectedPrinted << "\", " 9349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "got \"" << Printer.getPrinted() << "\""; 9449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 9549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return ::testing::AssertionSuccess(); 9649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 9749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 9844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX98Matches(StringRef Code, 9944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko StringRef DeclName, 10044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko StringRef ExpectedPrinted) { 101976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++98"); 10249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 103976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 1042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper namedDecl(hasName(DeclName)).bind("id"), 10549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ExpectedPrinted); 10649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 10749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 10844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX98Matches( 10949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef Code, 11049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const DeclarationMatcher &NodeMatch, 11149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 112976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++98"); 11349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 114976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 11549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko NodeMatch, 11649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ExpectedPrinted); 11749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 11849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 11949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX11Matches(StringRef Code, 12049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef DeclName, 12149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 122976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++11"); 12349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 124976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 1252dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper namedDecl(hasName(DeclName)).bind("id"), 12649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ExpectedPrinted); 12749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 12849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 12949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX11Matches( 13049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef Code, 13149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const DeclarationMatcher &NodeMatch, 13249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 133976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++11"); 13449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 135976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 13649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko NodeMatch, 13749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ExpectedPrinted); 13849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 13949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 14049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} // unnamed namespace 14149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 14249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespace1) { 14344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 14449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A { int B; }", 14549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 14649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A {\n}")); 14749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with { ... } 14849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 14949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 15049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespace2) { 15149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 15249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline namespace A { int B; }", 15349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 15449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline namespace A {\n}")); 15549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with { ... } 15649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 15749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 15849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespaceAlias1) { 15944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 16049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace Z { }" 16149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = Z;", 16249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 16349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = Z")); 16449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 16549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 16649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 16749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespaceAlias2) { 16844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 16949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace X { namespace Y {} }" 17049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = X::Y;", 17149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 17249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = X::Y")); 17349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 17449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 17549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 17649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl1) { 17744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 17849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A { int a; };", 17949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 18049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A {\n}")); 18149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 18249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 18349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 18449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl2) { 18544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 18649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a; };", 18749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 18849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 18949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 19049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 19149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 19249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl3) { 19344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 19449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "union A { int a; };", 19549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 19649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "union A {\n}")); 19749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 19849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 19949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 20049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl4) { 20144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 20249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 20349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : Z { int b; };", 20449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 20549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : Z {\n}")); 20649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without two spaces 20749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 20849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 20949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl5) { 21044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 21149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { int a; };" 21249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A : Z { int b; };", 21349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 21449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A : Z {\n}")); 21549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without two spaces 21649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 21749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 21849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl6) { 21944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 22049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 22149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : public Z { int b; };", 22249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 22349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : public Z {\n}")); 22449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 22549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 22649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 22749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl7) { 22844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 22949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 23049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : protected Z { int b; };", 23149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 23249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : protected Z {\n}")); 23349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 23449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 23549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 23649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl8) { 23744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 23849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 23949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : private Z { int b; };", 24049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 24149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : private Z {\n}")); 24249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 24349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 24449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 24549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl9) { 24644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 24749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 24849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual Z { int b; };", 24949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 25049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual Z {\n}")); 25149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without two spaces 25249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 25349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 25449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl10) { 25544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 25649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 25749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z { int b; };", 25849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 25949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z {\n}")); 26049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 26149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 26249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 26349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl11) { 26444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 26549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 26649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Y : virtual public Z { int b; };" 26749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z, private Y { int c; };", 26849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 26949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z, private Y {\n}")); 27049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 27149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 27249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 27349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl1) { 27444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 27549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A();", 27649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 27749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A()")); 27849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 27949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 28049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 28149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl2) { 28244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 2832e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A() {}", 2842e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "A", 2852e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A()")); 2862e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 2872e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko} 2882e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko 2892e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl3) { 29044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 2912e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void Z();" 2922e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A() { Z(); }", 2932e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "A", 2942e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A()")); 2952e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 2962e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko} 2972e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko 2982e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl4) { 29944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 30049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "extern void A();", 30149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 30249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "extern void A()")); 30349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 30449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 30549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3062e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl5) { 30744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 30849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "static void A();", 30949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 31049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "static void A()")); 31149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 31249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 31349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3142e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl6) { 31544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 31649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline void A();", 31749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 31849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline void A()")); 31949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 32049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 32149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3222e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl7) { 32349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 32449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "constexpr int A(int a);", 32549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 32649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "int A(int a)")); 32749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "constexpr int A(int a);" 32849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 32949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3302e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl8) { 33144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 33249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a);", 33349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 33449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 33549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 33649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 33749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3382e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl9) { 33944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 34049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(...);", 34149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 34249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(...)")); 34349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 34449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 34549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3462e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl10) { 34744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 34849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, ...);", 34949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 35049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, ...)")); 35149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 35249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 35349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3542e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl11) { 35544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 35649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef long size_t;" 35749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef int *pInt;" 35849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, pInt b, size_t c);", 35949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 36049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, pInt b, size_t c)")); 36149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 36249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 36349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3642e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl12) { 36544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 36649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, int b = 0);", 36749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 36849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, int b = 0)")); 36949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 37049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 37149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3722e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl13) { 37344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 37449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A(int a))(int b);", 37549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 37649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A(int a))(int)")); 37749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with parameter name (?) 37849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 37949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3802e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl14) { 38144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 38249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 38349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T t) { }" 38449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<>" 38549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int N) { }", 3862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionDecl(hasName("A"), isExplicitTemplateSpecialization()).bind("id"), 3872e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A(int N)")); 38849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template <> void A(int N);")); 38949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 39049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 39149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 39249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl1) { 39344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 39449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 39549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A();" 39649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 3972dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 39849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 39949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A();" 40049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 40149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 40249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl2) { 40344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 40449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 40549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(int a);" 40649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 40849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 40949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A(int a);" 41049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 41149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 41249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl3) { 41344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 41449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 41549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(const A &a);" 41649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 41849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 41949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A(const A &a);" 42049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 42149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 42249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl4) { 42344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 42449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 42549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(const A &a, int = 0);" 42649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 42849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 42949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A(const A &a, int = 0);" 43049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 43149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 43249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl5) { 43349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 43449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 43549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(const A &&a);" 43649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4372dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 43849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 43949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A(const A &&a);" 44049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 44149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 44249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl6) { 44344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 44449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 44549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " explicit A(int a);" 44649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 44849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 44949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "explicit A(int a);" 45049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 45149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 45249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl7) { 45344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 45449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 45549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " constexpr A();" 45649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4572dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 45849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 45949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "constexpr A();" 46049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 46149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 46249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl8) { 46344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 46449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 46549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A() = default;" 46649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 46849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "")); 46949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A() = default;" 47049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 47149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 47249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl9) { 47344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 47449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 47549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A() = delete;" 47649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4772dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 47849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " = delete")); 47949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "A() = delete;" 48049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 48149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 482c4684244c529284a1350d3cbc98615d1deab7f05Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl10) { 483c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 484c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "template<typename... T>" 485c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "struct A {" 486c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko " A(const A &a);" 487c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "};", 4882dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 489c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "")); 490c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko // WRONG; Should be: "A(const A &a);" 491c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko} 492c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko 49329b1f682ac168d71370287a1e955311b4901681aNAKAMURA Takumi#if !defined(_MSC_VER) 494c4684244c529284a1350d3cbc98615d1deab7f05Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl11) { 495c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 496c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "template<typename... T>" 497c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "struct A : public T... {" 498c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko " A(T&&... ts) : T(ts)... {}" 499c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "};", 5002dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 501c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "A<T...>(T &&ts...) : T(ts)")); 502f6ec15a23d271b45f8c0296b7ac44e994119bb8eDmitri Gribenko // WRONG; Should be: "A(T&&... ts) : T(ts)..." 503c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko} 50429b1f682ac168d71370287a1e955311b4901681aNAKAMURA Takumi#endif 505c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko 50649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXDestructorDecl1) { 50744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 50849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 50949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " ~A();" 51049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5112dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper destructorDecl(ofClass(hasName("A"))).bind("id"), 51249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void ~A()")); 51349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "~A();" 51449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 51549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 51649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXDestructorDecl2) { 51744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 51849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 51949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual ~A();" 52049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5212dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper destructorDecl(ofClass(hasName("A"))).bind("id"), 52249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "virtual void ~A()")); 52349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "virtual ~A();" 52449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 52549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 52649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConversionDecl1) { 52744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 52849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 52949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " operator int();" 53049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("A"))).bind("id"), 53249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "int operator int()")); 53349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "operator int();" 53449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 53549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 53649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConversionDecl2) { 53744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 53849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 53949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " operator bool();" 54049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5412dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("A"))).bind("id"), 54249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "bool operator _Bool()")); 54349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "operator bool();" 54449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 54549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 54649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConversionDecl3) { 54744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 54849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {};" 54949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 55049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " operator Z();" 55149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("A"))).bind("id"), 55349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z operator struct Z()")); 55449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "operator Z();" 55549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 55649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 55749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction1) { 55844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 55949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace std { typedef decltype(sizeof(int)) size_t; }" 56049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 56149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void *operator new(std::size_t);" 56249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5632dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 56449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void *operator new(std::size_t)")); 56549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 56649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 56749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 56849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction2) { 56944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 57049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace std { typedef decltype(sizeof(int)) size_t; }" 57149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 57249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void *operator new[](std::size_t);" 57349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 57549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void *operator new[](std::size_t)")); 57649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 57749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 57849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 57949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction3) { 58044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 58149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 58249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void operator delete(void *);" 58349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 58549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void operator delete(void *) noexcept")); 58649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without noexcept? 58749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 58849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 58949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction4) { 59044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 59149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 59249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void operator delete(void *);" 59349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5942dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 59549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void operator delete(void *)")); 59649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 59749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 59849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 59949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction5) { 60044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 60149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 60249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void operator delete[](void *);" 60349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 60549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void operator delete[](void *) noexcept")); 60649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without noexcept? 60749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 60849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 60949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_Operator1) { 61049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const char *OperatorNames[] = { 61149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "+", "-", "*", "/", "%", "^", "&", "|", 61249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "=", "<", ">", "+=", "-=", "*=", "/=", "%=", 61349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "^=", "&=", "|=", "<<", ">>", ">>=", "<<=", "==", "!=", 61449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "<=", ">=", "&&", "||", ",", "->*", 61549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "()", "[]" 61649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko }; 61749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 61849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko for (unsigned i = 0, e = llvm::array_lengthof(OperatorNames); i != e; ++i) { 61949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Code; 62049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("struct Z { void operator"); 62149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append(OperatorNames[i]); 62249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("(Z z); };"); 62349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 62449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Expected; 62549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("void operator"); 62649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append(OperatorNames[i]); 62749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("(Z z)"); 62849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 62949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 63044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 63149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code, 6322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 63349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected)); 63449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 63549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 63649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 63749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_Operator2) { 63849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const char *OperatorNames[] = { 63949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "~", "!", "++", "--", "->" 64049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko }; 64149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 64249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko for (unsigned i = 0, e = llvm::array_lengthof(OperatorNames); i != e; ++i) { 64349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Code; 64449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("struct Z { void operator"); 64549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append(OperatorNames[i]); 64649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("(); };"); 64749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 64849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Expected; 64949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("void operator"); 65049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append(OperatorNames[i]); 65149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("()"); 65249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 65349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 65444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 65549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code, 6562dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 65749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected)); 65849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 65949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 66049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 66149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl1) { 66244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 66349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 66449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a);" 66549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 66649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 66749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 66849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 66949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 67049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 67149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl2) { 67244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 67349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 67449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual void A(int a);" 67549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 67649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 67749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "virtual void A(int a)")); 67849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 67949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 68049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 68149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl3) { 68244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 68349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 68449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual void A(int a);" 68549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};" 68649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct ZZ : Z {" 68749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a);" 68849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 68949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "ZZ::A", 69049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 69149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 69249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // TODO: should we print "virtual"? 69349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 69449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 69549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl4) { 69644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 69749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 69849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " inline void A(int a);" 69949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 70049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 70149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline void A(int a)")); 70249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 70349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 70449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 70549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl5) { 70644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 70749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 70849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual void A(int a) = 0;" 70949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 71049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 71149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "virtual void A(int a) = 0")); 71249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 71349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 71449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 71549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_CVQualifier1) { 71644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 71749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 71849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) const;" 71949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 72049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 72149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) const")); 72249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 72349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 72449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 72549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_CVQualifier2) { 72644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 72749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 72849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) volatile;" 72949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 73049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 73149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) volatile")); 73249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 73349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 73449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 73549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_CVQualifier3) { 73644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 73749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 73849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) const volatile;" 73949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 74049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 74149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) const volatile")); 74249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 74349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 74449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 74549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_RefQualifier1) { 74649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 74749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 74849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) &;" 74949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 75049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 75149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 75249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) &;" 75349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 75449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 75549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_RefQualifier2) { 75649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 75749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 75849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) &&;" 75949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 76049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 76149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 76249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) &&;" 76349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 76449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 76549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification1) { 76644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 76749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 76849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) throw();" 76949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 77049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 77149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) throw()")); 77249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 77349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 77449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 77549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification2) { 77644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 77749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 77849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) throw(int);" 77949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 78049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 78149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) throw(int)")); 78249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 78349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 78449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 78549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification3) { 78644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 78749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class ZZ {};" 78849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 78949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) throw(ZZ, int);" 79049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 79149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 79249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) throw(ZZ, int)")); 79349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 79449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 79549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 79649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification4) { 79749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 79849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 79949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept;" 80049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 80149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 80249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept")); 80349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 80449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 80549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 80649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification5) { 80749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 80849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 80949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept(true);" 81049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 81149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 81249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept(trueA(int a) noexcept(true)")); 81349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) noexcept(true);" 81449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 81549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 81649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification6) { 81749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 81849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 81949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept(1 < 2);" 82049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 82149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 82249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept(1 < 2A(int a) noexcept(1 < 2)")); 82349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) noexcept(1 < 2);" 82449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 82549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 82649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification7) { 82749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 82849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N>" 82949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 83049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept(N < 2);" 83149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 83249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 83349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept(N < 2A(int a) noexcept(N < 2)")); 83449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) noexcept(N < 2);" 83549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 83649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 83749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestVarDecl1) { 83844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 83949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "char *const (*(*A)[5])(int);", 84049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 84149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "char *const (*(*A)[5])(int)")); 84249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 84349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 84449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 84549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestVarDecl2) { 84644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 84749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() throw(int);", 84849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 84949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() throw(int)")); 85049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 85149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 85249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 85349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestVarDecl3) { 85449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 85549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() noexcept;", 85649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 85749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() noexcept")); 85849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 85949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 86049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 86149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFieldDecl1) { 86244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 86349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 86449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { T A; };", 86549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 86649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "T A")); 86749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 86849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 86949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 87049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFieldDecl2) { 87144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 87249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N>" 87349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { int A[N]; };", 87449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 87549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "int A[N]")); 87649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 87749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 87849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 87949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl1) { 88044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 88149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 88249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };", 8832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 88449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T> struct A {\n}")); 88549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 88649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 88749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 88849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl2) { 88944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 89049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T = int>" 89149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };", 8922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 89349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T = int> struct A {\n}")); 89449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 89549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 89649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 89749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl3) { 89844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 89949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<class T>" 90049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };", 9012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 90249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <class T> struct A {\n}")); 90349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 90449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 90549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 90649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl4) { 90744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 90849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T, typename U>" 90949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; U b; };", 9102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 91149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T, typename U> struct A {\n}")); 91249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 91349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 91449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 91549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl5) { 91644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 91749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N>" 91849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a[N]; };", 9192dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 92049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <int N> struct A {\n}")); 92149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 92249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 92349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 92449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl6) { 92544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 92649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N = 42>" 92749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a[N]; };", 9282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 92949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <int N = 42> struct A {\n}")); 93049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 93149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 93249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 93349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl7) { 93444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 93549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef int MyInt;" 93649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<MyInt N>" 93749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a[N]; };", 9382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 93949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <MyInt N> struct A {\n}")); 94049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 94149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 94249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 94349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl8) { 94444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 94549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename U> class T> struct A { };", 9462dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 94749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <template <typename U> class T> struct A {\n}")); 94849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 94949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 95049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 95149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl9) { 95244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 95349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z { };" 95449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename U> class T = Z> struct A { };", 9552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 95649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <template <typename U> class T> struct A {\n}")); 95749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 95849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 95949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 96049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl10) { 96149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 96249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T>" 96349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a; };", 9642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 96549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename ... T> struct A {\n}")); 96649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without spaces before '...' 96749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 96849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 96949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl11) { 97049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 97149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T>" 97249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A : public T... { int a; };", 9732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 97449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename ... T> struct A : public T... {\n}")); 97549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without spaces before '...' 97649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 97749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 97849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplatePartialSpecializationDecl1) { 97944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 98049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T, typename U>" 98149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; U b; };" 98249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 98349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A<T, int> { T a; };", 9842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateSpecializationDecl().bind("id"), 98549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 98649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template<typename T> struct A<T, int> { ... }" 98749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 98849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 98949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplatePartialSpecializationDecl2) { 99044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 99149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 99249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };" 99349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 99449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A<T *> { T a; };", 9952dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateSpecializationDecl().bind("id"), 99649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 99749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template<typename T> struct A<T *> { ... }" 99849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 99949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 100049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateSpecializationDecl1) { 100144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 100249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 100349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };" 100449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<>" 100549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A<int> { int a; };", 10062dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateSpecializationDecl().bind("id"), 100749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 100849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template<> struct A<int> { ... }" 100949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 101049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 101149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl1) { 101244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 101349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 101449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T &t);", 10152dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 101649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T> void A(T &t)")); 101749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 101849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 101949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 102049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl2) { 102144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 102249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 102349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T &t) { }", 10242dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 10252e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "template <typename T> void A(T &t)")); 10262e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 102749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 102849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 102949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl3) { 103049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 103149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T>" 103249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T... a);", 10332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 103449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename ... T> void A(T a...)")); 103549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template <typename ... T> void A(T... a)" 103649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // (not "T a...") 103749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon. 103849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 103949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 104049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl4) { 104144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 104249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { template<typename T> void A(T t); };", 10432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 104449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T> void A(T t)")); 104549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 104649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 104749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 104849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl5) { 104944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 105049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { template<typename T> void A(T t) {} };", 10512dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 10522e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "template <typename T> void A(T t)")); 10532e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 105449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 105549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 105649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl6) { 105744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 105849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T >struct Z {" 105949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " template<typename U> void A(U t) {}" 106049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 10612dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 10622e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "template <typename U> void A(U t)")); 10632e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 106449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 106549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 106649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList1) { 106744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 106849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 106949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct X {};" 107049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A;", 107149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 107249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A")); 107349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 107449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 107549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 107649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList2) { 107744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 107849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T, typename U> struct Z {};" 107949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct X {};" 108049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef int Y;" 108149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X, Y> A;", 108249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 108349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X, Y> A")); 108449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 108549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 108649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 108749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList3) { 108844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 108949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 109049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X {};" 109149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int> > A;", 109249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 109349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int> > A")); 109449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 109549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 109649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 109749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList4) { 109849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 109949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 110049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X {};" 110149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int>> A;", 110249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 110349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int> > A")); 110449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 110549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 110649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 110749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList5) { 110844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 110949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 111049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X { Z<T> A; };", 111149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 111249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<T> A")); 111349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 111449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 111549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 111649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList6) { 111744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 111849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Z {};" 111949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X {};" 112049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A;", 112149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 112249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A")); 112349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 112449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 112549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 112649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList7) { 112744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 112849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Z {};" 112949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Y {" 113049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<U> A;" 113149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 113249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 113349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<U> A")); 113449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 113549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 113649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 113749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList8) { 113844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 113949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 114049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Y {" 114149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<U<int> > A;" 114249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 114349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 114449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<U<int> > A")); 114549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 114649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 114749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 114849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList9) { 114944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 115049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct Z {};" 115149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<0> A;", 115249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 115349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<0> A")); 115449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 115549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 115649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 115749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList10) { 115844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 115949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct Z {};" 116049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct X { Z<I> A; };", 116149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 116249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<I> A")); 116349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 116449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 116549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 116649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList11) { 116744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 116849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int I> struct Z {};" 116949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<42 * 10 - 420 / 1> A;", 117049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 117149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<42 * 10 - 420 / 1> A")); 117249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 117349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 117449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 117549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList12) { 117644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 117749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<const char *p> struct Z {};" 117849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "extern const char X[] = \"aaa\";" 117949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A;", 118049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 118149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A")); 118249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 118349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 118449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 118549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList13) { 118649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 118749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct Z {};" 118849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct X {" 118949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<T...> A;" 119049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 119149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 119249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<T...> A")); 119349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 119449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 119549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 119649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList14) { 119749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 119849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct Z {};" 119949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Y {};" 120049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct X {" 120149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<Y<T>...> A;" 120249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 120349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 120449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<Y<T>...> A")); 120549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 120649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 120749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 120849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList15) { 120949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 121049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct Z {};" 121149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct X {" 121249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<sizeof...(T)> A;" 121349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 121449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 121549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<sizeof...(T)> A")); 121649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 121749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 121844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko 1219