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