--- Comment #26 from driscoll at cs dot wisc dot edu 2010-08-27 22:02
---
I was surprised to see this is not caught by a warning as well. (The discussion
of whether it should be an error is silly; it pretty clearly shouldn't be.
There's -Werror if you disagree.)
Motivation: This surfaced in the code I'm working on as it has several similar
functions that return std::sets of objects. I changed several of them to return
by const-reference for efficiency purposes, but not all of them could be
modified such. I then changed call sites so that the return was stored in a
const-reference instead of copied. I expected the compiler to be able to catch
any mismatches (storing the by-value return in a reference), but when I ran a
test to see if it would, there was no warning.
Examples:
This first one is inspired by the code I was working on:
int retByVal() {
return 5;
}
int foo() {
int const & v = retByVal(); // no warning
return v;// no warning
}
but you don't even need to get that complicated. The following illustrates as
well:
int foo() {
int const & x = 4; // no warning
return x; // no warning
}
Comparison of compilers:
- GCC fails to warn for either examples:
- 3.3.3, 3.4.6 (-Wall -W)
- 4.1.2, 4.5.1 (-Wall -Wextra)
- MSVC fails to warn for either of these examples
- 2005, 2008 (level 4)
- 2010 (all warnings, /Wall)
- The EDG front end warns if remarks are on:
- Intel CC (10.1 -Wall), *does* warn about these examples. E.g.:
remark #383: value copied to temporary, reference to temporary used
int const & v = retByVal();
- Comeau (with -r) warns
I haven't lost debugging time to this or anything like that, but I am a bit
disappointed and surprised to see that neither MSVC nor GCC warns for this
almost-certain error and thought I'd contribute in the hopes that another
person running across it might inspire someone to fix it.
--
driscoll at cs dot wisc dot edu changed:
What|Removed |Added
CC| |driscoll at cs dot wisc dot
||edu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=986