1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
4b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// Check for declaration matching with out-of-line declarations and
5b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// variadic templates, which involves proper computation of the
6b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// injected-class-name.
7b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
8b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0 {
9b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  typedef T type;
10b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
11b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  void f0(T);
12b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  type f1(T);
13b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor};
14b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
15b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
16b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, Types...>::f0(T) { }
17b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
18b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
19b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, Types...>::type X0<T, Types...>::f1(T) { }
20b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
21b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
22b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...> {
23b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  typedef T* result;
24b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  result f3();
25b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
26b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  template<typename... InnerTypes>
27b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  struct Inner;
28b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor};
29b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
30b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
31b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; }
32b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
33b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
34b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes>
35b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...>::Inner {
36b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  template<typename ...ReallyInner> void f4();
37b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor};
38b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
39b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
40b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes>
41b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...ReallyInner>
42b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, T, Types...>::Inner<InnerTypes...>::f4() { }
432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregornamespace rdar8848837 {
452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  // Out-of-line definitions that cause rebuilding in the current
462fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  // instantiation.
472fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  template<typename F> struct X;
482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  template<typename R, typename ...ArgTypes>
502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  struct X<R(ArgTypes...)> {
512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    X<R(ArgTypes...)> f();
522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  };
532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  template<typename R, typename ...ArgTypes>
552fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; }
562fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
572fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
582fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  X<int(float, double)> xif;
592fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
604f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  template<unsigned> struct unsigned_c { };
614f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  template<typename ...ArgTypes> int g(ArgTypes...);
624f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
634f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  template<typename F> struct X1;
644f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
654f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  template<typename R, typename ...ArgTypes>
664f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  struct X1<R(ArgTypes...)> {
674f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor    unsigned_c<sizeof(1 + g(ArgTypes()...))> f();
684f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  };
694f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
704f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  template<typename R, typename ...ArgTypes>
714f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  unsigned_c<sizeof(1 + g(ArgTypes()...))> X1<R(ArgTypes...)>::f() {
724f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor    return unsigned_c<sizeof(int)>();
734f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  }
744f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
754f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  X1<int(float, double)> xif2;
762fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor}
77