]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaTemplate/default-expr-arguments-3.cpp
Vendor import of clang trunk r290819:
[FreeBSD/FreeBSD.git] / test / SemaTemplate / default-expr-arguments-3.cpp
1 // RUN: %clang_cc1 -std=c++14 -verify -ast-dump %s | FileCheck %s
2 // expected-no-diagnostics
3
4 // CHECK: FunctionDecl {{.*}} used func 'void (void)'
5 // CHECK-NEXT: TemplateArgument type 'int'
6 // CHECK: LambdaExpr {{.*}} 'class (lambda at
7 // CHECK: ParmVarDecl {{.*}} used f 'enum foo' cinit
8 // CHECK-NEXT: DeclRefExpr {{.*}} 'enum foo' EnumConstant {{.*}} 'a' 'enum foo'
9
10 namespace PR28795 {
11   template<typename T>
12   void func() {
13     enum class foo { a, b };
14     auto bar = [](foo f = foo::a) { return f; };
15     bar();
16   }
17
18   void foo() {
19     func<int>();
20   }
21 }
22
23 // CHECK: ClassTemplateSpecializationDecl {{.*}} struct class2 definition
24 // CHECK-NEXT: TemplateArgument type 'int'
25 // CHECK: LambdaExpr {{.*}} 'class (lambda at
26 // CHECK: ParmVarDecl {{.*}} used f 'enum foo' cinit
27 // CHECK-NEXT: DeclRefExpr {{.*}} 'enum foo' EnumConstant {{.*}} 'a' 'enum foo'
28
29 // Template struct case:
30 template <class T> struct class2 {
31   void bar() {
32     enum class foo { a, b };
33     [](foo f = foo::a) { return f; }();
34   }
35 };
36
37 template struct class2<int>;
38
39 // CHECK: FunctionTemplateDecl {{.*}} f1
40 // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename T
41 // CHECK-NEXT: FunctionDecl {{.*}} f1 'void (void)'
42 // CHECK: FunctionDecl {{.*}} f1 'void (void)'
43 // CHECK-NEXT: TemplateArgument type 'int'
44 // CHECK: ParmVarDecl {{.*}} n 'enum foo' cinit
45 // CHECK-NEXT: DeclRefExpr {{.*}} 'enum foo' EnumConstant {{.*}} 'a' 'enum foo'
46
47 template<typename T>
48 void f1() {
49   enum class foo { a, b };
50   struct S {
51     int g1(foo n = foo::a);
52   };
53 }
54
55 template void f1<int>();