namespace std { template T&& forward(T& a); } template void perfect_forwarding(T&& arg) { std::forward(arg); } template void perfect_forwarding(T0, T1&& arg1) { std::forward(arg1); } template void perfect_forwarding_pack(Ts&&... args) { auto _ [] = {std::forward(args)...}; } template void perfect_forwarding_pack(T, Ts&&... args) { auto _ [] = {std::forward(args)...}; } template void imperfect_forwarding_ref(T& arg) // expected-error@-1 {{Parameter 'arg' perfectly forwarded through 'std::forward' while not using universal references}} { std::forward(arg); } template void imperfect_forwarding_constref(const T& arg) // expected-error@-1 {{Parameter 'arg' perfectly forwarded through 'std::forward' while not using universal references}} { std::forward(arg); } template void imperfect_forwarding_val(T arg) // expected-error@-1 {{Parameter 'arg' perfectly forwarded through 'std::forward' while not using universal references}} { std::forward(arg); } template void imperfect_forwarding_constval(const T arg) // expected-error@-1 {{Parameter 'arg' perfectly forwarded through 'std::forward' while not using universal references}} { std::forward(arg); } #define IN_MACRO(funcname) template void funcname(const T arg) IN_MACRO(ignored){std::forward(arg);} template struct S { void nested_template(T arg) { // Probably incorrect, but dependent on the instantiation of S, which is generally not inferred. std::forward(arg); } };