131
|
1 // { dg-do compile { target c++17 } }
|
|
2 // { dg-options "-O2 -fdump-tree-eipa_sra" }
|
|
3
|
|
4
|
|
5 #include <type_traits>
|
|
6
|
|
7 typedef unsigned char __uint8_t;
|
|
8 typedef __uint8_t uint8_t;
|
|
9
|
|
10
|
|
11 struct A {
|
|
12 A() = default;
|
|
13 A(const A& o) = default;
|
|
14 A(const volatile A& o) : m1(o.m1) {}
|
|
15 uint8_t m1{0};
|
|
16 };
|
|
17
|
|
18 volatile uint8_t v;
|
|
19
|
|
20 template<typename T>
|
|
21 void f(const T& x) __attribute__((noinline));
|
|
22 template<typename T>
|
|
23 void f(const T& x) {
|
|
24 if constexpr(std::is_same<std::remove_cv_t<T>, A>::value) {
|
|
25 v = x.m1;
|
|
26 }
|
|
27 else {
|
|
28 v = x;
|
|
29 }
|
|
30 }
|
|
31
|
|
32 uint8_t n1;
|
|
33 A n2;
|
|
34
|
|
35 int main() {
|
|
36 f(n1);
|
|
37 f(n2);
|
|
38 }
|
|
39
|
|
40 // { dg-final { scan-tree-dump-times "Adjusting call" 2 "eipa_sra" } }
|