// RUN: %clang_analyze_cc1 -std=c++1z -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s

// expected-no-diagnostics

bool a();
bool b();

// Calls method a with some extra code to pass the minimum complexity
bool foo1(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return a();
  return true;
}

// Calls method b with some extra code to pass the minimum complexity
bool foo2(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return b();
  return true;
}

// Test that we don't crash on function pointer calls

bool (*funcPtr)(int);

bool fooPtr1(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return funcPtr(1);
  return true;
}

// Test that we respect the template arguments of function templates

template<typename T, unsigned N>
bool templateFunc() { unsigned i = N; return false; }

bool fooTemplate1(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return templateFunc<int, 1>();
  return true;
}

bool fooTemplate2(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return templateFunc<long, 1>();
  return true;
}

bool fooTemplate3(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return templateFunc<long, 2>();
  return true;
}

// Test that we don't just concatenate the template arguments into a string
// without having any padding between them (e.g. foo<X, XX>() != foo<XX, X>()).

class X {};
class XX {};

template<typename T1, typename T2>
bool templatePaddingFunc() { return false; }

bool fooTemplatePadding1(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return templatePaddingFunc<X, XX>();
  return true;
}

bool fooTemplatePadding2(int x) {
  if (x > 0)
    return false;
  else if (x < 0)
    return templatePaddingFunc<XX, X>();
  return true;
}

// Test that we don't crash on member functions of template instantiations.

template<typename T>
struct A {
  void foo(T t) {}
};

void fooTestInstantiation() {
  A<int> a;
  a.foo(1);
}
