[Bug c++/31904] New: fail to link to static const double

2007-05-11 Thread dennis0yang at gmail dot com
The following code fail to compile under cygwin. The relevant error message is:
...: undefined reference to `Base::x'
collect2: ld returned 1 exit status
However if I change the statement "y=-x" to "y=x", then it compiles fine.


class Base
{
  public:
virtual void f () = 0;
static const double x = 1;
};

class Derived : public Base
{
  public:
Derived () {};
void f () { double y = -x; };
};

int main()
{
  Derived foo;
  return 0;
}
~


-- 
   Summary: fail to link to static const double
   Product: gcc
   Version: 3.4.4
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
    ReportedBy: dennis0yang at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31904



[Bug c++/31904] fail to link to static const double

2007-05-12 Thread dennis0yang at gmail dot com


--- Comment #3 from dennis0yang at gmail dot com  2007-05-12 09:29 ---
Subject: Re:  fail to link to static const double

I understand that the standard only specifies that static const for 
integral type can be assigned within the class. My point is that if gcc 
decides to allow the extension of assigning static const double within 
the class (good extension, I don't see why this is not in the 
standard.), then it should allow me to link to it. Note the code works 
if I change "y=-x" to "y= -1 * x", so it is clearly a bug.

I also tried your suggestion before submitting the bug report. It does 
work. But I really do not want to create a .cpp file just to put that 
one line in it, much prefer to leave everything in the .h file.

fang at csl dot cornell dot edu wrote:
> --- Comment #1 from fang at csl dot cornell dot edu  2007-05-12 09:06 
> ---
> You need to define Base::x out of class in some translation unit, the in-class
> declaration alone isn't enough, though sometimes the compiler will elide the
> reference to it if its value is known (optimization).
>
> const double Base::x = 1.0;
>
>
>   


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31904



[Bug c++/31904] fail to link to static const double

2007-05-12 Thread dennis0yang at gmail dot com


--- Comment #4 from dennis0yang at gmail dot com  2007-05-12 09:33 ---
Subject: Re:  fail to link to static const double

I just checked out the bug report you mentioned, are you sure they are 
the same? When I change "static const double" to "static const int", the 
code compiles without any problem. It also compiles when I replace the 
statement "y=-x" with "y= -1 * x". So maybe it is a different bug.

schwab at suse dot de wrote:
> --- Comment #2 from schwab at suse dot de  2007-05-12 09:15 ---
>
>
> *** This bug has been marked as a duplicate of 30745 ***
>
>
>   


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31904



[Bug c++/31904] fail to link to static const double

2007-05-12 Thread dennis0yang at gmail dot com


--- Comment #6 from dennis0yang at gmail dot com  2007-05-12 17:19 ---
Subject: Re:  fail to link to static const double

I understand perfectly well everything you said. But I think you miss 
the point of this bug report.
This is not about the c++ standard in terms of what should and should 
not be done. This is about get rid of the "luck" component in gcc. If 
gcc decides not to support in-class definition for static const double, 
then flag the statement as an error. I really don't see why the compile 
doesn't substitute the value everywhere it see the reference (as you 
mentioned), because it is a static const!

fang at csl dot cornell dot edu wrote:
> --- Comment #5 from fang at csl dot cornell dot edu  2007-05-12 16:53 
> ---
> Subject: Re:  fail to link to static const double
>
>   
>> ------- Comment #3 from dennis0yang at gmail dot com  2007-05-12 09:29 
>> ---
>> Subject: Re:  fail to link to static const double
>>
>> I understand that the standard only specifies that static const for
>> integral type can be assigned within the class. My point is that if gcc
>> decides to allow the extension of assigning static const double within
>> the class (good extension, I don't see why this is not in the
>> standard.), then it should allow me to link to it. Note the code works
>> if I change "y=-x" to "y= -1 * x", so it is clearly a bug.
>> 
>
> To *link* to something correctly with a reference, you need EXACTLY ONE
> definition, same as in C.  An in-class declaration is not a definition.
> It cannot be treated as such because you'd end up with a definition in
> each translation unit that includes the header (multiply defined).  The
> cases in which the compile/link 'worked' for you were cases in which the
> compiler substituted the value for the reference (you got lucky).  I don't
> know the heuristics for the decision, maybe ask someone familiar with the
> constant-folding opt.
>
>   
>> I also tried your suggestion before submitting the bug report. It does
>> work. But I really do not want to create a .cpp file just to put that
>> one line in it, much prefer to leave everything in the .h file.
>> 
>
> Defining it once in a .cpp file is the correct thing to do, even if it is
> inconvenient.
>
> Hope this helps.
>
>   
>> fang at csl dot cornell dot edu wrote:
>> 
>>> --- Comment #1 from fang at csl dot cornell dot edu  2007-05-12 09:06 
>>> ---
>>> You need to define Base::x out of class in some translation unit, the 
>>> in-class
>>> declaration alone isn't enough, though sometimes the compiler will elide the
>>> reference to it if its value is known (optimization).
>>>
>>> const double Base::x = 1.0;
>>>   
>
>
>   


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31904