1e21d5f43SAkira Hatanaka // RUN: %clang_cc1 -std=c++14 -verify -ast-dump %s | FileCheck %s
2d644e021SAkira Hatanaka // expected-no-diagnostics
3d644e021SAkira Hatanaka 
48c20828bSAaron Ballman // CHECK: FunctionDecl {{.*}} used func 'void ()'
5e21d5f43SAkira Hatanaka // CHECK-NEXT: TemplateArgument type 'int'
68c20828bSAaron Ballman // CHECK: LambdaExpr {{.*}} '(lambda at
7*888673b6SJonas Devlieghere // CHECK: ParmVarDecl {{.*}} used f 'foo' cinit
88c20828bSAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} 'foo' EnumConstant {{.*}} 'a' 'foo'
9e21d5f43SAkira Hatanaka 
10d644e021SAkira Hatanaka namespace PR28795 {
11d644e021SAkira Hatanaka   template<typename T>
func()12d644e021SAkira Hatanaka   void func() {
13d644e021SAkira Hatanaka     enum class foo { a, b };
14d644e021SAkira Hatanaka     auto bar = [](foo f = foo::a) { return f; };
15d644e021SAkira Hatanaka     bar();
16d644e021SAkira Hatanaka   }
17d644e021SAkira Hatanaka 
foo()18d644e021SAkira Hatanaka   void foo() {
19d644e021SAkira Hatanaka     func<int>();
20d644e021SAkira Hatanaka   }
21d644e021SAkira Hatanaka }
22d644e021SAkira Hatanaka 
23e21d5f43SAkira Hatanaka // CHECK: ClassTemplateSpecializationDecl {{.*}} struct class2 definition
24dfc4bff1SRichard Smith // CHECK: TemplateArgument type 'int'
258c20828bSAaron Ballman // CHECK: LambdaExpr {{.*}} '(lambda at
26*888673b6SJonas Devlieghere // CHECK: ParmVarDecl {{.*}} used f 'foo' cinit
278c20828bSAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} 'foo' EnumConstant {{.*}} 'a' 'foo'
28e21d5f43SAkira Hatanaka 
29d644e021SAkira Hatanaka // Template struct case:
30d644e021SAkira Hatanaka template <class T> struct class2 {
barclass231d644e021SAkira Hatanaka   void bar() {
32d644e021SAkira Hatanaka     enum class foo { a, b };
33d644e021SAkira Hatanaka     [](foo f = foo::a) { return f; }();
34d644e021SAkira Hatanaka   }
35d644e021SAkira Hatanaka };
36d644e021SAkira Hatanaka 
37d644e021SAkira Hatanaka template struct class2<int>;
38d644e021SAkira Hatanaka 
39e21d5f43SAkira Hatanaka // CHECK: FunctionTemplateDecl {{.*}} f1
401832a028SRichard Smith // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T
418c20828bSAaron Ballman // CHECK-NEXT: FunctionDecl {{.*}} f1 'void ()'
428c20828bSAaron Ballman // CHECK: FunctionDecl {{.*}} f1 'void ()'
43e21d5f43SAkira Hatanaka // CHECK-NEXT: TemplateArgument type 'int'
44*888673b6SJonas Devlieghere // CHECK: ParmVarDecl {{.*}} n 'foo' cinit
458c20828bSAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} 'foo' EnumConstant {{.*}} 'a' 'foo'
46e21d5f43SAkira Hatanaka 
47d644e021SAkira Hatanaka template<typename T>
f1()48d644e021SAkira Hatanaka void f1() {
49d644e021SAkira Hatanaka   enum class foo { a, b };
50d644e021SAkira Hatanaka   struct S {
51d644e021SAkira Hatanaka     int g1(foo n = foo::a);
52d644e021SAkira Hatanaka   };
53d644e021SAkira Hatanaka }
54d644e021SAkira Hatanaka 
55d644e021SAkira Hatanaka template void f1<int>();
56