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