xref: /llvm-project/clang/test/SemaCXX/issue547.cpp (revision 36ee9fb219579e8bcac3032a042b3bddd98b3938)
19ca5c425SRichard Smith // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2c6e68daaSAndy Gibbs // expected-no-diagnostics
3205d5e3aSDouglas Gregor 
4205d5e3aSDouglas Gregor template<typename T>
5205d5e3aSDouglas Gregor struct classify_function {
6205d5e3aSDouglas Gregor   static const unsigned value = 0;
7205d5e3aSDouglas Gregor };
8205d5e3aSDouglas Gregor 
9205d5e3aSDouglas Gregor template<typename R, typename ...Args>
10205d5e3aSDouglas Gregor struct classify_function<R(Args...)> {
11205d5e3aSDouglas Gregor   static const unsigned value = 1;
12205d5e3aSDouglas Gregor };
13205d5e3aSDouglas Gregor 
14205d5e3aSDouglas Gregor template<typename R, typename ...Args>
1563168c75SRichard Smith struct classify_function<R(Args...) const> {
16205d5e3aSDouglas Gregor   static const unsigned value = 2;
17205d5e3aSDouglas Gregor };
18205d5e3aSDouglas Gregor 
19205d5e3aSDouglas Gregor template<typename R, typename ...Args>
2063168c75SRichard Smith struct classify_function<R(Args...) volatile> {
21205d5e3aSDouglas Gregor   static const unsigned value = 3;
22205d5e3aSDouglas Gregor };
23205d5e3aSDouglas Gregor 
24205d5e3aSDouglas Gregor template<typename R, typename ...Args>
2563168c75SRichard Smith struct classify_function<R(Args...) const volatile> {
26205d5e3aSDouglas Gregor   static const unsigned value = 4;
27205d5e3aSDouglas Gregor };
28205d5e3aSDouglas Gregor 
29205d5e3aSDouglas Gregor template<typename R, typename ...Args>
30*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...)> {
31205d5e3aSDouglas Gregor   static const unsigned value = 5;
32205d5e3aSDouglas Gregor };
33205d5e3aSDouglas Gregor 
34205d5e3aSDouglas Gregor template<typename R, typename ...Args>
35*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) const> {
36205d5e3aSDouglas Gregor   static const unsigned value = 6;
37205d5e3aSDouglas Gregor };
38205d5e3aSDouglas Gregor 
39205d5e3aSDouglas Gregor template<typename R, typename ...Args>
40*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) volatile> {
41205d5e3aSDouglas Gregor   static const unsigned value = 7;
42205d5e3aSDouglas Gregor };
43205d5e3aSDouglas Gregor 
44205d5e3aSDouglas Gregor template<typename R, typename ...Args>
45*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) const volatile> {
46205d5e3aSDouglas Gregor   static const unsigned value = 8;
47205d5e3aSDouglas Gregor };
48205d5e3aSDouglas Gregor 
49205d5e3aSDouglas Gregor template<typename R, typename ...Args>
50*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) &&> {
51205d5e3aSDouglas Gregor   static const unsigned value = 9;
52205d5e3aSDouglas Gregor };
53205d5e3aSDouglas Gregor 
54205d5e3aSDouglas Gregor template<typename R, typename ...Args>
55*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) const &> {
56205d5e3aSDouglas Gregor   static const unsigned value = 10;
57205d5e3aSDouglas Gregor };
58205d5e3aSDouglas Gregor 
59205d5e3aSDouglas Gregor typedef void f0(int) const;
60205d5e3aSDouglas Gregor typedef void f1(int, float...) const volatile;
61205d5e3aSDouglas Gregor typedef void f2(int, double, ...) &&;
62205d5e3aSDouglas Gregor typedef void f3(int, double, ...) const &;
63205d5e3aSDouglas Gregor 
64205d5e3aSDouglas Gregor int check0[classify_function<f0>::value == 2? 1 : -1];
65205d5e3aSDouglas Gregor int check1[classify_function<f1>::value == 8? 1 : -1];
66205d5e3aSDouglas Gregor int check2[classify_function<f2>::value == 9? 1 : -1];
67205d5e3aSDouglas Gregor int check3[classify_function<f3>::value == 10? 1 : -1];
68