injected-class-name.cpp revision 2fc1bb76e719d0620b4a6e2134413933b21ca6b6
1b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
2b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
3b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// Check for declaration matching with out-of-line declarations and
4b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// variadic templates, which involves proper computation of the
5b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// injected-class-name.
6b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
7b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0 {
8b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  typedef T type;
9b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
10b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  void f0(T);
11b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  type f1(T);
12b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor};
13b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
14b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
15b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, Types...>::f0(T) { }
16b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
17b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
18b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, Types...>::type X0<T, Types...>::f1(T) { }
19b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
20b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
21b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...> {
22b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  typedef T* result;
23b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  result f3();
24b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
25b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  template<typename... InnerTypes>
26b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  struct Inner;
27b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor};
28b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
29b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
30b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; }
31b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
32b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
33b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes>
34b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...>::Inner {
35b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  template<typename ...ReallyInner> void f4();
36b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor};
37b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
38b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types>
39b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes>
40b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...ReallyInner>
41b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, T, Types...>::Inner<InnerTypes...>::f4() { }
422fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregornamespace rdar8848837 {
442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  // Out-of-line definitions that cause rebuilding in the current
452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  // instantiation.
462fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  template<typename F> struct X;
472fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  template<typename R, typename ...ArgTypes>
492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  struct X<R(ArgTypes...)> {
502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    X<R(ArgTypes...)> f();
512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  };
522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  template<typename R, typename ...ArgTypes>
542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; }
552fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
562fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
572fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  X<int(float, double)> xif;
582fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
592fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor}
60