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 Hatanakavoid 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