https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95911
Bug ID: 95911
Summary: [8/9/10/11] returning && makes an error without any
warning
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: 570070308 at qq dot com
Target Milestone: ---
Created attachment 48789
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48789&action=edit
the .ii file
class A
{
public:
A()
{
printf("A create.\n");
}
A(const A&a)
{
printf("A copy create.\n");
}
A(A&&a)
{
printf("A move create.\n");
}
~A()
{
printf("A delete.\n");
}
};
A newA()
{
A a;
return a;
}
A&& bug(A&& x)
{
printf("bug\n");
return std::move(x);
}
int main()
{
A &&a=newA(); //ok
printf("----------\n");
A &&b=bug(newA()); //error
printf("----------\n");
A c=bug(newA()); //ok
printf("----------\n");
return 0;
}
runing the code, the result is:
A create.
----------
A create.
bug
A delete.
----------
A create.
bug
A move create.
A delete.
----------
A delete.
A delete.
In main function create three class A veriables, but only two class A veriables
are deleted at last. But the compiler do not give any warning. I have try -Wall
-Wextra but it still have no warning. I have tried with
-fno-elide-constructors, -O3 and -O0, the result is the same. In my
comprehension of c++, the second class A veriable should not be deleted. When
double using function bug(see the .ii file), you can find it was not deleted so
early. If it should be deleted, that means the code is dangerous and compiler
should give a warning. There is no warning in g++ 8/9/10/11, and also no
warning in clang++.