In the following case GCC correctly throws an error since simple_return_value is returning a pointer, not a reference:

"#include <iostream>

int & simple_return_value(int &temp)
{
        return &temp;
}


int main()
{
        int temp = 42;
        return simple_return_value(temp);
}"



However in deeply-nested code GCC appears to miss the error, and in fact still returns a reference despite the return value of a pointer.

Take the following code in plf_list (https://github.com/mattreecebentley/plf_list):

"template<typename... arguments>
inline PLF_LIST_FORCE_INLINE reference emplace_back(arguments &&... parameters)
{
return (emplace(end_iterator, std::forward<arguments>(parameters)...)).node_pointer->element;
}
"


emplace returns an iterator which contains a pointer to a node, which is then used to return the element at that node. However if you change the line to: "return &((emplace(end_iterator, std::forward<arguments>(parameters)...)).node_pointer->element);"


GCC 7.3 doesn't blink. Worse, it appears to return a reference anyway. The test suite cpp explicitly tests the return value of emplace_back, so changing the line should result in a test fail as well as a compile error. Neither occur. You can test this yourself by downloading the code + test suite at http://www.plflib.org/plf_list_18-06-2018.zip
and editing the line yourself (line 1981).

Clang 3.7.1 detects the error immediately.


I'm not sure at which stage this bug appears. Templating the code at the top of this mail doesn't recreate the bug, so it must be something to do with templated classes (I'm guessing here).

Hopefully someone can shed some light on this.

Reply via email to