Home | History | Annotate | Download | only in Misc
      1 // RUN: %clang_cc1 -ast-print %s > %t
      2 // RUN: FileCheck < %t %s -check-prefix=CHECK1
      3 // RUN: FileCheck < %t %s -check-prefix=CHECK2
      4 // RUN: %clang_cc1 -ast-dump %s | FileCheck --check-prefix=DUMP %s
      5 
      6 template <int X, typename Y, int Z = 5>
      7 struct foo {
      8   int constant;
      9   foo() {}
     10   Y getSum() { return Y(X + Z); }
     11 };
     12 
     13 template <int A, typename B>
     14 B bar() {
     15   return B(A);
     16 }
     17 
     18 void baz() {
     19   int x = bar<5, int>();
     20   int y = foo<5, int>().getSum();
     21   double z = foo<2, double, 3>().getSum();
     22 }
     23 
     24 // Template instantiation - foo
     25 // Since the order of instantiation may vary during runs, run FileCheck twice
     26 // to make sure each instantiation is in the correct spot.
     27 // CHECK1: template <int X = 5, typename Y = int, int Z = 5> struct foo {
     28 // CHECK2: template <int X = 2, typename Y = double, int Z = 3> struct foo {
     29 
     30 // Template definition - foo
     31 // CHECK1: template <int X, typename Y, int Z = 5> struct foo {
     32 // CHECK2: template <int X, typename Y, int Z = 5> struct foo {
     33 
     34 // Template instantiation - bar
     35 // CHECK1: template <int A = 5, typename B = int> int bar()
     36 // CHECK2: template <int A = 5, typename B = int> int bar()
     37 
     38 // Template definition - bar
     39 // CHECK1: template <int A, typename B> B bar()
     40 // CHECK2: template <int A, typename B> B bar()
     41 
     42 // CHECK1-LABEL: template <typename ...T> struct A {
     43 // CHECK1-NEXT:    template <T ...x[3]> struct B {
     44 template <typename ...T> struct A {
     45   template <T ...x[3]> struct B {};
     46 };
     47 
     48 // CHECK1-LABEL: template <typename ...T> void f(T ...[3]) {
     49 // CHECK1-NEXT:    A<T [3]...> a;
     50 template <typename ...T> void f(T ...[3]) {
     51   A<T [3]...> a;
     52 }
     53 
     54 namespace test2 {
     55 void func(int);
     56 void func(float);
     57 template<typename T>
     58 void tmpl() {
     59   func(T());
     60 }
     61 
     62 // DUMP: UnresolvedLookupExpr {{.*}} <col:3> '<overloaded function type>' lvalue (ADL) = 'func'
     63 }
     64