xref: /llvm-project/clang/test/CXX/drs/cwg177x.cpp (revision 463e61a0013253bec1b5e7f07e7b1803b68e2b3d)
1 // RUN: %clang_cc1 -std=c++98 %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s
2 // RUN: %clang_cc1 -std=c++11 %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11
3 // RUN: %clang_cc1 -std=c++14 %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11,CXX14
4 // RUN: %clang_cc1 -std=c++17 %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11,CXX14
5 // RUN: %clang_cc1 -std=c++20 %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11,CXX14
6 // RUN: %clang_cc1 -std=c++23 %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11,CXX14
7 // RUN: %clang_cc1 -std=c++2c %s -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11,CXX14
8 // RUN: %clang_cc1 -std=c++1z %s -fexceptions -fcxx-exceptions -pedantic-errors -triple i386-windows-pc -ast-dump | FileCheck %s --check-prefixes=CHECK,CXX11,CXX14
9 
10 namespace cwg1772 { // cwg1772: 14
11   // __func__ in a lambda should name operator(), not the containing function.
12   // CHECK: NamespaceDecl{{.+}}cwg1772
13 #if __cplusplus >= 201103L
14   auto x = []() { __func__; };
15   // CXX11: LambdaExpr
16   // CXX11: CXXRecordDecl
17   // CXX11: CXXMethodDecl{{.+}} operator() 'void () {{.*}}const'
18   // CXX11-NEXT: CompoundStmt
19   // CXX11-NEXT: PredefinedExpr{{.+}} 'const char[11]' lvalue __func__
20   // CXX11-NEXT: StringLiteral{{.+}} 'const char[11]' lvalue "operator()"
21 
22   void func() {
23     // CXX11: FunctionDecl{{.+}} func
24   (void)[]() { __func__; };
25   // CXX11-NEXT: CompoundStmt
26   // CXX11: LambdaExpr
27   // CXX11: CXXRecordDecl
28   // CXX11: CXXMethodDecl{{.+}} operator() 'void () {{.*}}const'
29   // CXX11-NEXT: CompoundStmt
30   // CXX11-NEXT: PredefinedExpr{{.+}} 'const char[11]' lvalue __func__
31   // CXX11-NEXT: StringLiteral{{.+}} 'const char[11]' lvalue "operator()"
32   }
33 #endif // __cplusplus >= 201103L
34 } // namespace cwg1772
35 
36 namespace cwg1779 { // cwg1779: 14
37   // __func__ in a function template, member function template, or generic
38   //  lambda should have a dependent type.
39   // CHECK: NamespaceDecl{{.+}}cwg1779
40 
41   template<typename T>
42   void FuncTemplate() {
43     __func__;
44     // CHECK: FunctionDecl{{.+}} FuncTemplate
45     // CHECK-NEXT: CompoundStmt
46     // CHECK-NEXT: PredefinedExpr{{.+}} '<dependent type>' lvalue __func__
47   }
48 
49   template<typename T>
50   class ClassTemplate {
51     // CHECK: ClassTemplateDecl{{.+}} ClassTemplate
52     void MemFunc() {
53       // CHECK: CXXMethodDecl{{.+}} MemFunc 'void (){{.*}}'
54       // CHECK-NEXT: CompoundStmt
55       // CHECK-NEXT: PredefinedExpr{{.+}} '<dependent type>' lvalue __func__
56       __func__;
57     }
58     void OutOfLineMemFunc();
59   };
60 
61   template <typename T> void ClassTemplate<T>::OutOfLineMemFunc() {
62     // CHECK: CXXMethodDecl{{.+}}parent{{.+}} OutOfLineMemFunc 'void (){{.*}}'
63     // CHECK-NEXT: CompoundStmt
64     // CHECK-NEXT: PredefinedExpr{{.+}} '<dependent type>' lvalue __func__
65     __func__;
66   }
67 
68 #if __cplusplus >= 201402L
69   void contains_generic_lambda() {
70     // CXX14: FunctionDecl{{.+}}contains_generic_lambda
71     // CXX14: LambdaExpr
72     // CXX14: CXXRecordDecl
73     // CXX14: CXXMethodDecl{{.+}} operator() 'auto (auto) {{.*}}const'
74     // CXX14-NEXT: ParmVarDecl
75     // CXX14-NEXT: CompoundStmt
76     // CXX14-NEXT: PredefinedExpr{{.+}} '<dependent type>' lvalue __func__
77     (void)[](auto x) {
78       __func__;
79     };
80   }
81 #endif // __cplusplus >= 201402L
82 } // namespace cwg1779
83