Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/cpp1z/decomp37.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 // { dg-do compile { target c++17 } } | |
2 | |
3 #include <memory> | |
4 #include <tuple> | |
5 #include <string> | |
6 | |
7 struct X : private std::shared_ptr<int> | |
8 { | |
9 std::string fun_payload; | |
10 }; | |
11 | |
12 template<int N> std::string& get(X& x) | |
13 { | |
14 if constexpr(N==0) return x.fun_payload; | |
15 } | |
16 | |
17 namespace std { | |
18 template<> class tuple_size<X> : public std::integral_constant<int, 1> {}; | |
19 template<> class tuple_element<0, X> {public: using type = std::string;}; | |
20 } | |
21 | |
22 struct X2 : private std::shared_ptr<int> | |
23 { | |
24 int fun_payload; | |
25 template <class T> void get(); | |
26 }; | |
27 | |
28 template<int N> int& get(X2& x) | |
29 { | |
30 if constexpr(N==0) return x.fun_payload; | |
31 } | |
32 | |
33 namespace std { | |
34 template<> class tuple_size<X2> : public std::integral_constant<int, 1> {}; | |
35 template<> class tuple_element<0, X2> {public: using type = int;}; | |
36 } | |
37 | |
38 class X3 | |
39 { | |
40 double fun_payload; | |
41 public: | |
42 template <int N> double& get() | |
43 { | |
44 if constexpr(N==0) return fun_payload; | |
45 } | |
46 }; | |
47 | |
48 namespace std { | |
49 template<> class tuple_size<X3> : public std::integral_constant<int, 1> {}; | |
50 template<> class tuple_element<0, X3> {public: using type = double;}; | |
51 } | |
52 | |
53 int main() | |
54 { | |
55 X x; | |
56 auto& [b1] = x; | |
57 X2 x2; | |
58 auto& [b2] = x2; | |
59 X3 x3; | |
60 auto& [b3] = x3; | |
61 } |