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;
AA14     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>
f(const T & x)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 
main()35 int main() {
36     f(n1);
37     f(n2);
38 }
39 
40 // { dg-final { scan-tree-dump-times "Adjusting call" 2 "eipa_sra" } }
41