(original) (raw)

Sorry, I abbreviated the “test case” a little too much.

APF2 is actually defined separately. And it’s in a union, which avoids the issue that there is no APFloat(void). So it’s something like:

union U {

U() {}

\~U() {}

APFloat APF2;

} u;

int main(int argc, char \*\*argv) {

APFloat APF1(APFloat::IEEEdouble());

u.APF2 = APF1;

u.APF2.print(dbgs());

}

So this is a little more nuanced than I thought. I think the design is that it should not be possible to construct an APFloat without semantics, and this union thing circumvents that. I still think it’s a bug, but fairly easy to avoid: either properly construct APF2, or avoid assignment.

-Alan

From: Friedman, Eli \[mailto:efriedma@codeaurora.org\]
Sent: Tuesday, October 16, 2018 1:35 PM
To: Davis, Alan; llvm-dev@lists.llvm.org
Subject: \[EXTERNAL\] Re: \[llvm-dev\] bug is APFloat assignment

On 10/16/2018 11:21 AM, Davis, Alan via llvm-dev wrote:

I am getting a segfault when assigning one APFloat to another, as in:

APFloat APF1(APFloat::IEEEdouble());

APFloat APF2 = APF1;


Just tried it; seems to work fine.


APFloat is a wrapper class that wraps either an IEEEFloat or a DoubleAPFloat. A union called Storage in APFloat contains the underlying object, which is one of those two types. The assignment APF2 = APF1


What assignment? "APFloat APF2 = APF1;" calls the copy constructor, not the assignment operator.

\-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project