https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59552
Eric Gallager <egallager at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|WAITING |NEW --- Comment #3 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #2) > The request refers to arguments of non-trivial types but I think it's just > as applicable to trivial types, if not more. A test case for an > expensive-to-copy trivial type might look something like this. The caller > of f0() must make a copy of x but the caller of g0() need not, and GCC just > passes the address of x to it. Since the definition of f0() doesn't change > the argument, it would be more efficient if the caller didn't have to make > the copy. In C++, GCC could suggest to declare f0() to take its argument by > const reference instead. (In C, it could suggest to take it by const > pointer.) In addition, declaring the const reference or pointer argument > restrict would make it clear that the callee doesn't change the argument > when it's passed by reference (this optimization is the subject of pr81009). > > typedef struct Big { > char a[32]; > } Big; > > int __attribute__ ((noclone, noinline)) > f0 (Big x) // suggest to declare f0 (const Big&) instead > { return __builtin_strlen (x.a); } > > int __attribute__ ((noclone, noinline)) > g0 (const Big *x) { return __builtin_strlen (x->a); } > > extern Big x; > > int f1 (void) > { > int n = f0 (x); > return n + 1; > } > > int g1 (void) > { > int n = g0 (&x); > return n + 1; > } > > I suspect the request for a warning for non-trivial types is based on the > assumption that such a type is expensive to copy. That may or may not be > true depending on the definition of the type but regardless, I think there > is an opportunity here for GCC to help users write more efficient code. OK, thanks, confirmed then.