xref: /aosp_15_r20/external/clang/test/SemaCXX/issue547.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*67e74705SXin Li // expected-no-diagnostics
3*67e74705SXin Li 
4*67e74705SXin Li template<typename T>
5*67e74705SXin Li struct classify_function {
6*67e74705SXin Li   static const unsigned value = 0;
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li template<typename R, typename ...Args>
10*67e74705SXin Li struct classify_function<R(Args...)> {
11*67e74705SXin Li   static const unsigned value = 1;
12*67e74705SXin Li };
13*67e74705SXin Li 
14*67e74705SXin Li template<typename R, typename ...Args>
15*67e74705SXin Li struct classify_function<R(Args...) const> {
16*67e74705SXin Li   static const unsigned value = 2;
17*67e74705SXin Li };
18*67e74705SXin Li 
19*67e74705SXin Li template<typename R, typename ...Args>
20*67e74705SXin Li struct classify_function<R(Args...) volatile> {
21*67e74705SXin Li   static const unsigned value = 3;
22*67e74705SXin Li };
23*67e74705SXin Li 
24*67e74705SXin Li template<typename R, typename ...Args>
25*67e74705SXin Li struct classify_function<R(Args...) const volatile> {
26*67e74705SXin Li   static const unsigned value = 4;
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li template<typename R, typename ...Args>
30*67e74705SXin Li struct classify_function<R(Args..., ...)> {
31*67e74705SXin Li   static const unsigned value = 5;
32*67e74705SXin Li };
33*67e74705SXin Li 
34*67e74705SXin Li template<typename R, typename ...Args>
35*67e74705SXin Li struct classify_function<R(Args..., ...) const> {
36*67e74705SXin Li   static const unsigned value = 6;
37*67e74705SXin Li };
38*67e74705SXin Li 
39*67e74705SXin Li template<typename R, typename ...Args>
40*67e74705SXin Li struct classify_function<R(Args..., ...) volatile> {
41*67e74705SXin Li   static const unsigned value = 7;
42*67e74705SXin Li };
43*67e74705SXin Li 
44*67e74705SXin Li template<typename R, typename ...Args>
45*67e74705SXin Li struct classify_function<R(Args..., ...) const volatile> {
46*67e74705SXin Li   static const unsigned value = 8;
47*67e74705SXin Li };
48*67e74705SXin Li 
49*67e74705SXin Li template<typename R, typename ...Args>
50*67e74705SXin Li struct classify_function<R(Args..., ...) &&> {
51*67e74705SXin Li   static const unsigned value = 9;
52*67e74705SXin Li };
53*67e74705SXin Li 
54*67e74705SXin Li template<typename R, typename ...Args>
55*67e74705SXin Li struct classify_function<R(Args..., ...) const &> {
56*67e74705SXin Li   static const unsigned value = 10;
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li typedef void f0(int) const;
60*67e74705SXin Li typedef void f1(int, float...) const volatile;
61*67e74705SXin Li typedef void f2(int, double, ...) &&;
62*67e74705SXin Li typedef void f3(int, double, ...) const &;
63*67e74705SXin Li 
64*67e74705SXin Li int check0[classify_function<f0>::value == 2? 1 : -1];
65*67e74705SXin Li int check1[classify_function<f1>::value == 8? 1 : -1];
66*67e74705SXin Li int check2[classify_function<f2>::value == 9? 1 : -1];
67*67e74705SXin Li int check3[classify_function<f3>::value == 10? 1 : -1];
68