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