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, 72a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian StringRef ExpectedPrinted, 73a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian StringRef FileName) { 7449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko PrintMatch Printer; 7549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko MatchFinder Finder; 7649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Finder.addMatcher(NodeMatch, &Printer); 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<FrontendActionFactory> Factory( 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines newFrontendActionFactory(&Finder)); 7949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 80a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian if (!runToolOnCodeWithArgs(Factory->create(), Code, Args, FileName)) 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return testing::AssertionFailure() 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << "Parsing error in \"" << Code.str() << "\""; 8349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 8449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (Printer.getNumFoundDecls() == 0) 8549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return testing::AssertionFailure() 8649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko << "Matcher didn't find any declarations"; 8749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 8849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (Printer.getNumFoundDecls() > 1) 8949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return testing::AssertionFailure() 9049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko << "Matcher should match only one declaration " 9149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "(found " << Printer.getNumFoundDecls() << ")"; 9249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 9349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko if (Printer.getPrinted() != ExpectedPrinted) 9449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return ::testing::AssertionFailure() 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << "Expected \"" << ExpectedPrinted.str() << "\", " 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "got \"" << Printer.getPrinted().str() << "\""; 9749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 9849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return ::testing::AssertionSuccess(); 9949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 10049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 10144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX98Matches(StringRef Code, 10244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko StringRef DeclName, 10344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko StringRef ExpectedPrinted) { 104976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++98"); 10549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 106976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 1072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper namedDecl(hasName(DeclName)).bind("id"), 108a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian ExpectedPrinted, 109a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "input.cc"); 11049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 11149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 11244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX98Matches( 11349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef Code, 11449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const DeclarationMatcher &NodeMatch, 11549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 116976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++98"); 11749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 118976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 11949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko NodeMatch, 120a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian ExpectedPrinted, 121a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "input.cc"); 12249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 12349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 12449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX11Matches(StringRef Code, 12549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef DeclName, 12649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 127976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++11"); 12849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 129976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 1302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper namedDecl(hasName(DeclName)).bind("id"), 131a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian ExpectedPrinted, 132a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "input.cc"); 13349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 13449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 13549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko::testing::AssertionResult PrintedDeclCXX11Matches( 13649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef Code, 13749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const DeclarationMatcher &NodeMatch, 13849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko StringRef ExpectedPrinted) { 139976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko std::vector<std::string> Args(1, "-std=c++11"); 14049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko return PrintedDeclMatches(Code, 141976f118dc5a2a89be29e6fd01e00f5a188b77847Dmitri Gribenko Args, 14249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko NodeMatch, 143a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian ExpectedPrinted, 144a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "input.cc"); 145a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian} 146a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines::testing::AssertionResult PrintedDeclCXX11nonMSCMatches( 148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Code, 149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const DeclarationMatcher &NodeMatch, 150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef ExpectedPrinted) { 151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::vector<std::string> Args(1, "-std=c++11"); 152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.push_back("-fno-delayed-template-parsing"); 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return PrintedDeclMatches(Code, 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args, 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NodeMatch, 156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExpectedPrinted, 157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "input.cc"); 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 160a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian::testing::AssertionResult PrintedDeclObjCMatches( 161a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian StringRef Code, 162a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian const DeclarationMatcher &NodeMatch, 163a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian StringRef ExpectedPrinted) { 164a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian std::vector<std::string> Args(1, ""); 165a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian return PrintedDeclMatches(Code, 166a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian Args, 167a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian NodeMatch, 168a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian ExpectedPrinted, 169a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "input.m"); 17049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 17149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 17249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} // unnamed namespace 17349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 174651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(DeclPrinter, TestTypedef1) { 175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASSERT_TRUE(PrintedDeclCXX98Matches( 176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef int A;", 177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "A", 178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef int A")); 179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 182651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(DeclPrinter, TestTypedef2) { 183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASSERT_TRUE(PrintedDeclCXX98Matches( 184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef const char *A;", 185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "A", 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef const char *A")); 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 190651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(DeclPrinter, TestTypedef3) { 191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASSERT_TRUE(PrintedDeclCXX98Matches( 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "template <typename Y> class X {};" 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef X<int> A;", 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "A", 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef X<int> A")); 196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 199651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(DeclPrinter, TestTypedef4) { 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASSERT_TRUE(PrintedDeclCXX98Matches( 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "namespace X { class Y {}; }" 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef X::Y A;", 203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "A", 204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef X::Y A")); 205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespace1) { 20944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 21049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A { int B; }", 21149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 21249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A {\n}")); 21349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with { ... } 21449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 21549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 21649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespace2) { 21749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 21849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline namespace A { int B; }", 21949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 22049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline namespace A {\n}")); 22149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with { ... } 22249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 22349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 22449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespaceAlias1) { 22544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 22649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace Z { }" 22749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = Z;", 22849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 22949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = Z")); 23049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 23149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 23249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 23349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestNamespaceAlias2) { 23444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 23549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace X { namespace Y {} }" 23649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = X::Y;", 23749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 23849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace A = X::Y")); 23949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 24049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 24149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 24249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl1) { 24344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 24449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A { int a; };", 24549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 24649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A {\n}")); 24749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 24849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 24949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 25049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl2) { 25144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 25249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a; };", 25349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 25449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 25549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 25649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 25749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 25849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl3) { 25944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 26049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "union A { int a; };", 26149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 26249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "union A {\n}")); 26349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 26449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 26549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 26649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl4) { 26744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 26849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 26949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : Z { int b; };", 27049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 27149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : Z {\n}")); 27249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without two spaces 27349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 27449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 27549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl5) { 27644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 27749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { int a; };" 27849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A : Z { int b; };", 27949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 28049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A : Z {\n}")); 28149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without two spaces 28249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 28349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 28449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl6) { 28544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 28649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 28749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : public Z { int b; };", 28849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 28949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : public Z {\n}")); 29049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 29149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 29249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 29349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl7) { 29444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 29549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 29649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : protected Z { int b; };", 29749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 29849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : protected Z {\n}")); 29949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 30049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 30149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 30249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl8) { 30344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 30449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 30549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : private Z { int b; };", 30649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 30749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : private Z {\n}")); 30849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 30949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 31049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 31149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl9) { 31244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 31349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 31449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual Z { int b; };", 31549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 31649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual Z {\n}")); 31749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without two spaces 31849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 31949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 32049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl10) { 32144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 32249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 32349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z { int b; };", 32449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 32549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z {\n}")); 32649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 32749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 32849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 32949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXRecordDecl11) { 33044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 33149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Z { int a; };" 33249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class Y : virtual public Z { int b; };" 33349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z, private Y { int c; };", 33449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 33549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class A : virtual public Z, private Y {\n}")); 33649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 33749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 33849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 33949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl1) { 34044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 34149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A();", 34249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 34349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A()")); 34449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 34549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 34649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 34749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl2) { 34844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 3492e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A() {}", 3502e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "A", 3512e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A()")); 3522e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 3532e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko} 3542e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko 3552e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl3) { 35644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 3572e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void Z();" 3582e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A() { Z(); }", 3592e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "A", 3602e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A()")); 3612e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 3622e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko} 3632e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko 3642e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl4) { 36544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 36649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "extern void A();", 36749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 36849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "extern void A()")); 36949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 37049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 37149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3722e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl5) { 37344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 37449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "static void A();", 37549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 37649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "static void A()")); 37749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 37849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 37949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3802e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl6) { 38144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 38249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline void A();", 38349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 38449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline void A()")); 38549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 38649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 38749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3882e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl7) { 38949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 39049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "constexpr int A(int a);", 39149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "constexpr int A(int a)")); 393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 39449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 39549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 3962e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl8) { 39744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 39849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a);", 39949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 40049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 40149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 40249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 40349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4042e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl9) { 40544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 40649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(...);", 40749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 40849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(...)")); 40949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 41049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 41149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4122e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl10) { 41344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 41449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, ...);", 41549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 41649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, ...)")); 41749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 41849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 41949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4202e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl11) { 42144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "typedef long ssize_t;" 42349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef int *pInt;" 424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "void A(int a, pInt b, ssize_t c);", 42549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "void A(int a, pInt b, ssize_t c)")); 42749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 42849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 42949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4302e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl12) { 43144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 43249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, int b = 0);", 43349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 43449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a, int b = 0)")); 43549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 43649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 43749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4382e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl13) { 43944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 44049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A(int a))(int b);", 44149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 44249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A(int a))(int)")); 44349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with parameter name (?) 44449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 44549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 4462e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri GribenkoTEST(DeclPrinter, TestFunctionDecl14) { 44744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 44849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 44949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T t) { }" 45049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<>" 45149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int N) { }", 4522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionDecl(hasName("A"), isExplicitTemplateSpecialization()).bind("id"), 4532e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "void A(int N)")); 45449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template <> void A(int N);")); 45549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 45649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 45749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 45849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl1) { 45944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 46049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 46149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A();" 46249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4632dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 46402a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A()")); 46549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 46649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 46749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl2) { 46844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 46949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 47049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(int a);" 47149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4722dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 47302a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A(int a)")); 47449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 47549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 47649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl3) { 47744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 47849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 47949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(const A &a);" 48049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 48202a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A(const A &a)")); 48349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 48449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 48549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl4) { 48644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 48749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 48849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(const A &a, int = 0);" 48949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 49102a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A(const A &a, int = 0)")); 49249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 49349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 49449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl5) { 49549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 49649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 49749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A(const A &&a);" 49849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 4992dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 50002a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A(const A &&a)")); 50149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 50249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 50349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl6) { 50444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 50549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 50649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " explicit A(int a);" 50749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5082dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 50965bcdabba34fddc303ab97f60dfea6079989306aFariborz Jahanian "explicit A(int a)")); 51049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 51149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 51249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl7) { 51344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 51449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 51549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " constexpr A();" 51649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "constexpr A()")); 51949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 52049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 52149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl8) { 52244470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 52349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 52449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A() = default;" 52549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 5271d28caf3b5254e60d3e3a1d2d37e5df2e5924111Richard Smith "A() = default")); 52849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 52949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 53049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl9) { 53144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 53249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 53349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " A() = delete;" 53449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5352dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 53602a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A() = delete")); 53749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 53849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 539c4684244c529284a1350d3cbc98615d1deab7f05Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl10) { 540c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 541c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "template<typename... T>" 542c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "struct A {" 543c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko " A(const A &a);" 544c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "};", 5452dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 54602a2e5a1dd0ad1b93f66040fc7aae6d69a918dafFariborz Jahanian "A<T...>(const A<T...> &a)")); 547c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko} 548c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko 549c4684244c529284a1350d3cbc98615d1deab7f05Dmitri GribenkoTEST(DeclPrinter, TestCXXConstructorDecl11) { 550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASSERT_TRUE(PrintedDeclCXX11nonMSCMatches( 551c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "template<typename... T>" 552c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "struct A : public T... {" 553c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko " A(T&&... ts) : T(ts)... {}" 554c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko "};", 5552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper constructorDecl(ofClass(hasName("A"))).bind("id"), 556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "A<T...>(T &&ts...) : T(ts)...")); 557f6ec15a23d271b45f8c0296b7ac44e994119bb8eDmitri Gribenko // WRONG; Should be: "A(T&&... ts) : T(ts)..." 558c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko} 559c4684244c529284a1350d3cbc98615d1deab7f05Dmitri Gribenko 56049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXDestructorDecl1) { 56144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 56249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 56349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " ~A();" 56449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5652dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper destructorDecl(ofClass(hasName("A"))).bind("id"), 566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "~A()")); 56749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 56849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 56949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXDestructorDecl2) { 57044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 57149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 57249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual ~A();" 57349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper destructorDecl(ofClass(hasName("A"))).bind("id"), 575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "virtual ~A()")); 57649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 57749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 57849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConversionDecl1) { 57944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 58049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 58149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " operator int();" 58249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("A"))).bind("id"), 584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "operator int()")); 58549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 58649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 58749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConversionDecl2) { 58844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 58949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 59049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " operator bool();" 59149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 5922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("A"))).bind("id"), 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "operator bool()")); 59449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 59549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 59649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXConversionDecl3) { 59744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 59849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {};" 59949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {" 60049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " operator Z();" 60149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6022dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("A"))).bind("id"), 603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "operator Z()")); 60449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 60549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 60649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction1) { 60744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 60849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace std { typedef decltype(sizeof(int)) size_t; }" 60949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 61049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void *operator new(std::size_t);" 61149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6122dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 61349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void *operator new(std::size_t)")); 61449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 61549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 61649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 61749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction2) { 61844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 61949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "namespace std { typedef decltype(sizeof(int)) size_t; }" 62049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 62149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void *operator new[](std::size_t);" 62249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6232dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 62449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void *operator new[](std::size_t)")); 62549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 62649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 62749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 62849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction3) { 62944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 63049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 63149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void operator delete(void *);" 63249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 63449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void operator delete(void *) noexcept")); 63549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without noexcept? 63649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 63749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 63849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction4) { 63944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 64049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 64149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void operator delete(void *);" 64249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 64449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void operator delete(void *)")); 64549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 64649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 64749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 64849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_AllocationFunction5) { 64944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 65049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 65149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void operator delete[](void *);" 65249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 6532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 65449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void operator delete[](void *) noexcept")); 65549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without noexcept? 65649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 65749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 65849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_Operator1) { 65949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const char *OperatorNames[] = { 66049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "+", "-", "*", "/", "%", "^", "&", "|", 66149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "=", "<", ">", "+=", "-=", "*=", "/=", "%=", 66249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "^=", "&=", "|=", "<<", ">>", ">>=", "<<=", "==", "!=", 66349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "<=", ">=", "&&", "||", ",", "->*", 66449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "()", "[]" 66549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko }; 66649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 66749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko for (unsigned i = 0, e = llvm::array_lengthof(OperatorNames); i != e; ++i) { 66849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Code; 66949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("struct Z { void operator"); 67049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append(OperatorNames[i]); 67149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("(Z z); };"); 67249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 67349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Expected; 67449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("void operator"); 67549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append(OperatorNames[i]); 67649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("(Z z)"); 67749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 67849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 67944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 68049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code, 6812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 68249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected)); 68349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 68449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 68549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 68649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_Operator2) { 68749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko const char *OperatorNames[] = { 68849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "~", "!", "++", "--", "->" 68949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko }; 69049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 69149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko for (unsigned i = 0, e = llvm::array_lengthof(OperatorNames); i != e; ++i) { 69249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Code; 69349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("struct Z { void operator"); 69449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append(OperatorNames[i]); 69549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code.append("(); };"); 69649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 69749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko SmallString<128> Expected; 69849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("void operator"); 69949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append(OperatorNames[i]); 70049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected.append("()"); 70149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 70249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 70344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 70449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Code, 7052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper methodDecl(ofClass(hasName("Z"))).bind("id"), 70649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko Expected)); 70749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko } 70849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 70949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 71049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl1) { 71144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 71249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 71349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a);" 71449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 71549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 71649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 71749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 71849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 71949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 72049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl2) { 72144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 72249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 72349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual void A(int a);" 72449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 72549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 72649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "virtual void A(int a)")); 72749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 72849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 72949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 73049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl3) { 73144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 73249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 73349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual void A(int a);" 73449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};" 73549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct ZZ : Z {" 73649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a);" 73749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 73849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "ZZ::A", 73949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a)")); 74049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 74149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // TODO: should we print "virtual"? 74249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 74349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 74449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl4) { 74544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 74649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 74749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " inline void A(int a);" 74849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 74949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 75049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "inline void A(int a)")); 75149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 75249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 75349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 75449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl5) { 75544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 75649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 75749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " virtual void A(int a) = 0;" 75849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 75949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 76049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "virtual void A(int a) = 0")); 76149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 76249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 76349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 76449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_CVQualifier1) { 76544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 76649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 76749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) const;" 76849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 76949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 77049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) const")); 77149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 77249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 77349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 77449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_CVQualifier2) { 77544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 77649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 77749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) volatile;" 77849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 77949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 78049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) volatile")); 78149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 78249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 78349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 78449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_CVQualifier3) { 78544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 78649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 78749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) const volatile;" 78849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 78949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 79049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) const volatile")); 79149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 79249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 79349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 79449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_RefQualifier1) { 79549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 79649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 79749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) &;" 79849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 79949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "void A(int a) &")); 801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 80249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 80349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 80449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestCXXMethodDecl_RefQualifier2) { 80549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 80649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 80749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) &&;" 80849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 80949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "void A(int a) &&")); 811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Should be: with semicolon 81249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 81349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 81449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification1) { 81544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 81649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 81749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) throw();" 81849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 81949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 82049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) throw()")); 82149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 82249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 82349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 82449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification2) { 82544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 82649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 82749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) throw(int);" 82849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 82949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 83049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) throw(int)")); 83149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 83249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 83349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 83449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification3) { 83544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 83649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "class ZZ {};" 83749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 83849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) throw(ZZ, int);" 83949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 84049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 84149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) throw(ZZ, int)")); 84249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 84349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 84449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 84549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification4) { 84649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 84749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 84849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept;" 84949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 85049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 85149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept")); 85249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 85349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 85449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 85549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification5) { 85649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 85749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 85849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept(true);" 85949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 86049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 86149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept(trueA(int a) noexcept(true)")); 86249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) noexcept(true);" 86349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 86449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 86549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification6) { 86649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 86749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 86849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept(1 < 2);" 86949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 87049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 87149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept(1 < 2A(int a) noexcept(1 < 2)")); 87249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) noexcept(1 < 2);" 87349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 87449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 87549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionDecl_ExceptionSpecification7) { 87649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 87749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N>" 87849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z {" 87949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " void A(int a) noexcept(N < 2);" 88049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 88149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 88249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(int a) noexcept(N < 2A(int a) noexcept(N < 2)")); 88349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "void A(int a) noexcept(N < 2);" 88449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 88549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 88649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestVarDecl1) { 88744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 88849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "char *const (*(*A)[5])(int);", 88949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 89049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "char *const (*(*A)[5])(int)")); 89149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 89249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 89349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 89449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestVarDecl2) { 89544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 89649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() throw(int);", 89749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 89849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() throw(int)")); 89949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 90049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 90149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 90249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestVarDecl3) { 90349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 90449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() noexcept;", 90549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 90649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void (*A)() noexcept")); 90749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 90849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 90949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 91049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFieldDecl1) { 91144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 91249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 91349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { T A; };", 91449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 91549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "T A")); 91649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 91749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 91849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 91949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFieldDecl2) { 92044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 92149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N>" 92249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { int A[N]; };", 92349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 92449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "int A[N]")); 92549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 92649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 92749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 92849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl1) { 92944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 93049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 93149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };", 9322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 93349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T> struct A {\n}")); 93449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 93549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 93649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 93749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl2) { 93844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 93949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T = int>" 94049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };", 9412dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 94249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T = int> struct A {\n}")); 94349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 94449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 94549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 94649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl3) { 94744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 94849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<class T>" 94949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };", 9502dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 95149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <class T> struct A {\n}")); 95249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 95349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 95449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 95549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl4) { 95644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 95749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T, typename U>" 95849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; U b; };", 9592dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 96049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T, typename U> struct A {\n}")); 96149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 96249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 96349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 96449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl5) { 96544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 96649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N>" 96749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a[N]; };", 9682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 96949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <int N> struct A {\n}")); 97049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 97149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 97249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 97349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl6) { 97444470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 97549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int N = 42>" 97649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a[N]; };", 9772dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 97849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <int N = 42> struct A {\n}")); 97949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 98049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 98149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 98249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl7) { 98344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 98449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef int MyInt;" 98549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<MyInt N>" 98649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a[N]; };", 9872dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 98849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <MyInt N> struct A {\n}")); 98949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 99049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 99149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 99249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl8) { 99344470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 99449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename U> class T> struct A { };", 9952dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 99649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <template <typename U> class T> struct A {\n}")); 99749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 99849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 99949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 100049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl9) { 100144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 100249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z { };" 100349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename U> class T = Z> struct A { };", 10042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 100549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <template <typename U> class T> struct A {\n}")); 100649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... } 100749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 100849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 100949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl10) { 101049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 101149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T>" 101249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { int a; };", 10132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 101449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename ... T> struct A {\n}")); 101549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without spaces before '...' 101649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 101749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 101849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateDecl11) { 101949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 102049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T>" 102149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A : public T... { int a; };", 10222dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateDecl(hasName("A")).bind("id"), 102349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename ... T> struct A : public T... {\n}")); 102449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, with { ... }, without spaces before '...' 102549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 102649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 102749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplatePartialSpecializationDecl1) { 102844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 102949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T, typename U>" 103049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; U b; };" 103149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 103249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A<T, int> { T a; };", 10332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateSpecializationDecl().bind("id"), 103449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 103549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template<typename T> struct A<T, int> { ... }" 103649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 103749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 103849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplatePartialSpecializationDecl2) { 103944470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 104049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 104149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };" 104249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 104349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A<T *> { T a; };", 10442dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateSpecializationDecl().bind("id"), 104549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 104649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template<typename T> struct A<T *> { ... }" 104749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 104849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 104949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestClassTemplateSpecializationDecl1) { 105044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 105149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 105249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A { T a; };" 105349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<>" 105449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A<int> { int a; };", 10552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper classTemplateSpecializationDecl().bind("id"), 105649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct A {\n}")); 105749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template<> struct A<int> { ... }" 105849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 105949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 106049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl1) { 106144470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 106249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 106349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T &t);", 10642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 106549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T> void A(T &t)")); 106649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 106749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 106849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 106949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl2) { 107044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 107149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T>" 107249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T &t) { }", 10732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 10742e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "template <typename T> void A(T &t)")); 10752e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 107649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 107749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 107849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl3) { 107949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 108049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T>" 108149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "void A(T... a);", 10822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 108349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename ... T> void A(T a...)")); 108449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // WRONG; Should be: "template <typename ... T> void A(T... a)" 108549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // (not "T a...") 108649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon. 108749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 108849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 108949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl4) { 109044470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 109149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { template<typename T> void A(T t); };", 10922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 109349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template <typename T> void A(T t)")); 109449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 109549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 109649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 109749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl5) { 109844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 109949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct Z { template<typename T> void A(T t) {} };", 11002dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 11012e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "template <typename T> void A(T t)")); 11022e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 110349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 110449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 110549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestFunctionTemplateDecl6) { 110644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 110749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T >struct Z {" 110849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " template<typename U> void A(U t) {}" 110949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 11102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper functionTemplateDecl(hasName("A")).bind("id"), 11112e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko "template <typename U> void A(U t)")); 11122e0b8d9c0b16c4f3e3bed992205ce43a0908915dDmitri Gribenko // Should be: with semicolon 111349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 111449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 111549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList1) { 111644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 111749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 111849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct X {};" 111949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A;", 112049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 112149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A")); 112249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 112349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 112449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 112549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList2) { 112644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 112749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T, typename U> struct Z {};" 112849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "struct X {};" 112949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "typedef int Y;" 113049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X, Y> A;", 113149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 113249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X, Y> A")); 113349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 113449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 113549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 113649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList3) { 113744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 113849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 113949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X {};" 114049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int> > A;", 114149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 114249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int> > A")); 114349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 114449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 114549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 114649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList4) { 114749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 114849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 114949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X {};" 115049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int>> A;", 115149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 115249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X<int> > A")); 115349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 115449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 115549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 115649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList5) { 115744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 115849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 115949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X { Z<T> A; };", 116049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 116149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<T> A")); 116249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 116349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 116449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 116549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList6) { 116644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 116749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Z {};" 116849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct X {};" 116949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A;", 117049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 117149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A")); 117249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 117349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 117449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 117549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList7) { 117644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 117749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Z {};" 117849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Y {" 117949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<U> A;" 118049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 118149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 118249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<U> A")); 118349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 118449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 118549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 118649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList8) { 118744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 118849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Z {};" 118949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<template<typename T> class U> struct Y {" 119049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<U<int> > A;" 119149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 119249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 119349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<U<int> > A")); 119449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 119549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 119649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 119749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList9) { 119844470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 119949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct Z {};" 120049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<0> A;", 120149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 120249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<0> A")); 120349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 120449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 120549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 120649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList10) { 120744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 120849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct Z {};" 120949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct X { Z<I> A; };", 121049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 121149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<I> A")); 121249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 121349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 121449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 121549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList11) { 121644470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 121749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<int I> struct Z {};" 121849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<42 * 10 - 420 / 1> A;", 121949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 122049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<42 * 10 - 420 / 1> A")); 122149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 122249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 122349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 122449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList12) { 122544470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX98Matches( 122649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<const char *p> struct Z {};" 122749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "extern const char X[] = \"aaa\";" 122849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A;", 122949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 123049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<X> A")); 123149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon 123249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 123349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 123449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList13) { 123549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 123649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct Z {};" 123749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct X {" 123849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<T...> A;" 123949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 124049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 124149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<T...> A")); 124249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 124349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 124449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 124549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList14) { 124649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 124749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct Z {};" 124849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename T> struct Y {};" 124949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct X {" 125049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<Y<T>...> A;" 125149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 125249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 125349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<Y<T>...> A")); 125449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 125549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 125649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko 125749795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri GribenkoTEST(DeclPrinter, TestTemplateArgumentList15) { 125849795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko ASSERT_TRUE(PrintedDeclCXX11Matches( 125949795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<unsigned I> struct Z {};" 126049795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "template<typename... T> struct X {" 126149795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko " Z<sizeof...(T)> A;" 126249795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "};", 126349795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "A", 126449795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko "Z<sizeof...(T)> A")); 126549795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko // Should be: with semicolon, without extra space in "> >" 126649795ae2c7cbb0845ed07b6626ac24275234e3d1Dmitri Gribenko} 126744470efba52b730fa1874eea9caacd2839a1af22Dmitri Gribenko 1268a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz JahanianTEST(DeclPrinter, TestObjCMethod1) { 1269a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian ASSERT_TRUE(PrintedDeclObjCMatches( 1270a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "__attribute__((objc_root_class)) @interface X\n" 1271a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "- (int)A:(id)anObject inRange:(long)range;\n" 1272a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "@end\n" 1273a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "@implementation X\n" 1274a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "- (int)A:(id)anObject inRange:(long)range { int printThis; return 0; }\n" 1275a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian "@end\n", 1276a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian namedDecl(hasName("A:inRange:"), 1277a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian hasDescendant(namedDecl(hasName("printThis")))).bind("id"), 127840902d817e5a73850045d8a0c9795bc5047ee000Fariborz Jahanian "- (int) A:(id)anObject inRange:(long)range")); 1279a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian} 1280a7a68b61e809a74fb5d34d57d7429fcc95e1ccadFariborz Jahanian 128188d158c631c4c08831855f601990f36f2234f975Fariborz JahanianTEST(DeclPrinter, TestObjCProtocol1) { 128288d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian ASSERT_TRUE(PrintedDeclObjCMatches( 128388d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P1, P2;", 128488d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian namedDecl(hasName("P1")).bind("id"), 128588d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P1;\n")); 128688d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian ASSERT_TRUE(PrintedDeclObjCMatches( 128788d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P1, P2;", 128888d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian namedDecl(hasName("P2")).bind("id"), 128988d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P2;\n")); 129088d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian} 129188d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian 129288d158c631c4c08831855f601990f36f2234f975Fariborz JahanianTEST(DeclPrinter, TestObjCProtocol2) { 129388d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian ASSERT_TRUE(PrintedDeclObjCMatches( 129488d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P2 @end" 129588d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P1<P2> @end", 129688d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian namedDecl(hasName("P1")).bind("id"), 129788d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian "@protocol P1<P2>\n@end")); 129888d158c631c4c08831855f601990f36f2234f975Fariborz Jahanian} 1299