[LLVMbugs] [Bug 8652] New: -fno-elide-constructors doesn't prevent all elisions
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Fri Nov 19 13:22:54 PST 2010
http://llvm.org/bugs/show_bug.cgi?id=8652
Summary: -fno-elide-constructors doesn't prevent all elisions
Product: clang
Version: trunk
Platform: PC
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: C++
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: reid.kleckner at gmail.com
CC: llvmbugs at cs.uiuc.edu, dgregor at apple.com
I was drafting up a quiz question about C++ copy constructors of the form
"given this program, what does it print?" where the copy ctor keeps a counter
for the number of calls it gets. The point is that copying objects can be
slow, and it's easy to write C++ code that does it if you're not careful.
However, I need to be careful because there are circumstances in which a copy
ctor call can be elided by the standard, even if it has side-effects.
Interestingly, both clang and gcc elide copy constructors regardless of the
optimization level, which is not what I expected. I discovered that gcc has
the -fno-elide-constructors option, which I used to check if my example had
elidable copy constructors by comparing the output of the program with and
without elision. Clang has the same option, but it doesn't seem to work when
applied to my small sample program:
[rnk at methacholine quiz2]$ cat elision.cpp
#include <iostream>
static int copies = 0;
struct CopyCounter {
CopyCounter() { }
CopyCounter(const CopyCounter &obj) {
copies++;
}
};
CopyCounter foo() {
return CopyCounter();
}
int main(int argc, char **argv) {
CopyCounter a(foo());
std::cout << copies << '\n';
return 0;
}
[rnk at methacholine quiz2]$ g++ elision.cpp -o elision && ./elision
0
[rnk at methacholine quiz2]$ g++ -fno-elide-constructors elision.cpp -o elision &&
./elision
2
[rnk at methacholine quiz2]$ clang++ elision.cpp -o elision && ./elision
0
[rnk at methacholine quiz2]$ clang++ -fno-elide-constructors elision.cpp -o
elision && ./elision
0
Is this a bug? Is clang missing a check for LangOpts::ElideConstructors
somewhere in CodeGen?
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list