This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/60583] New: Garbled data, "temporary bound ... only persists until the constructor exits", fine with clang++
- From: "andreaskem at web dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 19 Mar 2014 11:19:23 +0000
- Subject: [Bug c++/60583] New: Garbled data, "temporary bound ... only persists until the constructor exits", fine with clang++
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60583
Bug ID: 60583
Summary: Garbled data, "temporary bound ... only persists until
the constructor exits", fine with clang++
Product: gcc
Version: 4.8.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: andreaskem at web dot de
Created attachment 32389
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32389&action=edit
Problematic code
Hello,
I have a problem with the following code (boiled down from a larger source file
exhibiting the problem):
//------------------------
#include <iostream>
using namespace std;
struct Vector {
double x;
double y;
double z;
};
class Baz {
private:
Vector r;
Vector u;
public:
Baz(const Vector& p, const Vector& v) : r{p.x,p.y,p.z}, u{v.x,v.y,v.z} {}
const Vector& get_u() const {
return(u);
};
void write() const {
cout << "r: " << r.x << "," << r.y << "," << r.z << "; u: " << u.x << ","
<< u.y << "," << u.z << endl;
};
};
class Foo {
private:
const Baz& b;
public:
Foo(const Baz& b_) : b{b_} {}
void bar();
};
void Foo::bar() {
b.write();
int iters{10};
b.write();
}
int main(void) {
Baz b{Vector{0.5, 0.5, 0.5}, Vector{1e6, 0.1, 0.1}};
Foo f{b};
f.bar();
}
//------------------------
Compiling this with
---
$ g++ -Wall -Wextra -std=c++11 ~/test.cpp
---
leads to the following warnings:
---
***test.cpp: In constructor âFoo::Foo(const Baz&)â:
***test.cpp:33:27: warning: a temporary bound to âFoo::bâ only persists until
the constructor exits [-Wextra]
***test.cpp: In member function âvoid Foo::bar()â:
***test.cpp:41:6: warning: unused variable âitersâ [-Wunused-variable]
---
and running the program shows that the data is garbled:
---
$ ./a.out
r: 6.95315e-310,2.07351e-317,0.5; u: 6.95315e-310,0.1,0.1
r: 6.95315e-310,2.07352e-317,0.5; u: 6.95315e-310,0.1,2.24932e-313
---
Using b(b_) instead of b{b_} seems to fix the first warning and the output. I
don't quite understand what is happening here. Moreover, clang++ (3.3 or 3.4)
does not print such a warning (it only complains about the unused iters
variable) and the output is not garbled:
---
$ clang++ -Wall -Wextra -std=c++11 ~/test.cpp; ./a.out
***test.cpp:41:6: warning: unused variable 'iters' [-Wunused-variable]
int iters{10};
^
1 warning generated.
r: 0.5,0.5,0.5; u: 1e+06,0.1,0.1
r: 0.5,0.5,0.5; u: 1e+06,0.1,0.1
---
What is going on here?
I tried two gcc versions, 4.7.2 and 4.8.2.
gcc version 4.7.2 (Debian 4.7.2-5)
(I am currently at work and have to use gcc 4.7.2 to create the .ii file
attached to my report)
I first noticed the problem on my home computer with
gcc version 4.8.2 20140206 (prerelease) (GCC)
--------
Details:
gcc version 4.8.2 20140206 (prerelease) (GCC)
gcc version 4.7.2 (Debian 4.7.2-5)
clang version 3.4 (tags/RELEASE_34/final)
clang version 3.3 (tags/RELEASE_33/final)
Linux 3.13.6-1-ARCH #1 SMP PREEMPT Fri Mar 7 22:47:48 CET 2014 x86_64 GNU/Linux