56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -std=c++14 -verify -ast-dump %s | FileCheck %s
 | 
						|
// expected-no-diagnostics
 | 
						|
 | 
						|
// CHECK: FunctionDecl {{.*}} used func 'void (void)'
 | 
						|
// CHECK-NEXT: TemplateArgument type 'int'
 | 
						|
// CHECK: LambdaExpr {{.*}} 'class (lambda at
 | 
						|
// CHECK: ParmVarDecl {{.*}} used f 'enum foo' cinit
 | 
						|
// CHECK-NEXT: DeclRefExpr {{.*}} 'enum foo' EnumConstant {{.*}} 'a' 'enum foo'
 | 
						|
 | 
						|
namespace PR28795 {
 | 
						|
  template<typename T>
 | 
						|
  void func() {
 | 
						|
    enum class foo { a, b };
 | 
						|
    auto bar = [](foo f = foo::a) { return f; };
 | 
						|
    bar();
 | 
						|
  }
 | 
						|
 | 
						|
  void foo() {
 | 
						|
    func<int>();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// CHECK: ClassTemplateSpecializationDecl {{.*}} struct class2 definition
 | 
						|
// CHECK: TemplateArgument type 'int'
 | 
						|
// CHECK: LambdaExpr {{.*}} 'class (lambda at
 | 
						|
// CHECK: ParmVarDecl {{.*}} used f 'enum foo' cinit
 | 
						|
// CHECK-NEXT: DeclRefExpr {{.*}} 'enum foo' EnumConstant {{.*}} 'a' 'enum foo'
 | 
						|
 | 
						|
// Template struct case:
 | 
						|
template <class T> struct class2 {
 | 
						|
  void bar() {
 | 
						|
    enum class foo { a, b };
 | 
						|
    [](foo f = foo::a) { return f; }();
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
template struct class2<int>;
 | 
						|
 | 
						|
// CHECK: FunctionTemplateDecl {{.*}} f1
 | 
						|
// CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T
 | 
						|
// CHECK-NEXT: FunctionDecl {{.*}} f1 'void (void)'
 | 
						|
// CHECK: FunctionDecl {{.*}} f1 'void (void)'
 | 
						|
// CHECK-NEXT: TemplateArgument type 'int'
 | 
						|
// CHECK: ParmVarDecl {{.*}} n 'enum foo' cinit
 | 
						|
// CHECK-NEXT: DeclRefExpr {{.*}} 'enum foo' EnumConstant {{.*}} 'a' 'enum foo'
 | 
						|
 | 
						|
template<typename T>
 | 
						|
void f1() {
 | 
						|
  enum class foo { a, b };
 | 
						|
  struct S {
 | 
						|
    int g1(foo n = foo::a);
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
template void f1<int>();
 |