File: explicit15.C

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (83 lines) | stat: -rw-r--r-- 1,910 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// PR c++/87820
// { dg-do compile { target c++11 } }

struct A {
  constexpr explicit operator int() const { return 0; }
};

template<class T>
void f() {
  A a;
  T t1 = a; // { dg-error "cannot convert" }
  T t2 = {a}; // { dg-error "cannot convert" }
  T t3(a);
  T t4{a};
  T t5 = T(a);
  T t6 = T{a};
  new T(a);
  new T{a};
}

template<class T>
void g() {
  T t;
  int n1 = t; // { dg-error "cannot convert" }
  int n2 = {t}; // { dg-error "cannot convert" }
  int n3(t);
  int n4{t};
  int n5 = int(t);
  int n6 = int{t};
  new int(t);
  new int{t};
}

template void f<int>();
template void g<A>();

template<class T>
struct B {
  static constexpr A a{};
  static constexpr T t1 = a; // { dg-error "cannot convert" }
  static constexpr T t2 = {a}; // { dg-error "cannot convert" }
  static constexpr T t4{a};
  static constexpr T t5 = T(a);
  static constexpr T t6 = T{a};
};

template<class T>
struct C {
  static constexpr T t{};
  static constexpr int n1 = t; // { dg-error "cannot convert" }
  static constexpr int n2 = {t}; // { dg-error "cannot convert" }
  static constexpr int n4{t};
  static constexpr int n5 = int(t);
  static constexpr int n6 = int{t};
};

template struct B<int>;
template struct C<A>;

#if __cpp_inline_variables
template<class T>
struct D {
  static inline A a;
  static inline T t1 = a; // { dg-error "cannot convert" "" { target c++17 } }
  static inline T t2 = {a}; // { dg-error "cannot convert" "" { target c++17 } }
  static inline T t4{a};
  static inline T t5 = T(a);
  static inline T t6 = T{a};
};

template<class T>
struct E {
  static inline T t;
  static inline int n1 = t; // { dg-error "cannot convert" "" { target c++17 } }
  static inline int n2 = {t}; // { dg-error "cannot convert" "" { target c++17 } }
  static inline int n4{t};
  static inline int n5 = int(t);
  static inline int n6 = int{t};
};

template struct D<int>;
template struct E<A>;
#endif