[Bug c++/45082] New: Static const signed int class member causes undefined symbol.

2010-07-26 Thread rwitmer at xmission dot com
A class that has a static const signed int data member when passed to a
function as a const int& parameter will cause the data member to be an
undefined symbol.  If the static const signed int data member is re-typed as
const unsigned int the error goes away.  I've verified this on g++ 3.4.6 and
4.1.2. The following code example illustrates the error.

#include 

static const signed int GLOBAL_BUFF_SIZE=30;

class myclass
{
  public:

static const  int BUFF_SIZE = 20;  // Causes linker error.
  //static const   signed int BUFF_SIZE = 20;  // Causes linker error.
  //static const unsigned int BUFF_SIZE = 20;  // No linker error.

static const  int ANOTHER_BUFF_SIZE;

int myArray[BUFF_SIZE];

/*  Linker error.
% g++ static2.cpp
Undefined   first referenced
 symbol in file
myclass::BUFF_SIZE  /var/tmp//cc2IHYwP.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
% g++ --version
g++ (GCC) 3.4.6
and
g++ (GCC) 4.1.2
% ccppc --version
ccppc (Wind River VxWorks G++ DWARF-EH 4.1-131) 4.1.2
*/
};

// This solves the linker problem.  
// Not an option for me.  I need to dimension an array with BUFF_SIZE.
const int myclass::ANOTHER_BUFF_SIZE=20;

// Function that takes a constant reference to an integer.
// When a static const signed int is passed to this function
// that was defined in a class, you get the linker error.
// If that static const is declared unsigned int, you dont get the error.
// When the reference is to a global static, there is no error.
void funky(const int& in)
{
  printf("What came into funky() was %d\n", in);
}

int main()
{
  printf("%d\n", myclass::BUFF_SIZE);  // This doesn't cause the error.
  funky(myclass::BUFF_SIZE);   // This line causes the error.
  funky(myclass::ANOTHER_BUFF_SIZE);   // This doesn't cause the error.
  funky(GLOBAL_BUFF_SIZE); // This doesn't cause the error.
}


-- 
   Summary: Static const signed int class member causes undefined
symbol.
   Product: gcc
   Version: 4.1.2
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: rwitmer at xmission dot com


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



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-26 Thread rwitmer at xmission dot com


--- Comment #2 from rwitmer at xmission dot com  2010-07-26 15:59 ---
I agree with your assessment.  Adding const int myclass::BUFF_SIZE; resolves
the issue. 

The bug/feature may be that re-typing BUFF_SIZE to static const unsigned int
allows the compiler to not report a problem.  It doesn't require a const
unsigned myclass::BUFF_SIZE; anywhere and still compiles when it shouldn't.


-- 


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



[Bug c++/45082] Static const signed int class member causes undefined symbol.

2010-07-27 Thread rwitmer at xmission dot com


--- Comment #5 from rwitmer at xmission dot com  2010-07-27 15:27 ---
Thanks for all the great comments and insight.

I'm still confused as to why when the BUFF_SIZE was defined as:
static const   signed int BUFF_SIZE = 20;
it caused the error, but when it was defined as:
static const unsigned int BUFF_SIZE = 20;
it did not.

void funky(const int& in) is an example of a library call I had to use, I have
no control over the author's over zealousness on using a const int& parameter.

There were 2 things that solved the problem I was seeing:

1. Adding a const   signed int BUFF_SIZE; line to the .cpp file.  

I've seen lots of code where we define constants ala, static const int
BUFF_SIZE=20; in the .hpp file without any const int myclass::BUFF_SIZE; in the
.cpp files.  Is that wrong to exclude them, should we be including them in the
.cpp file?

2. Declaring the type during the call, ala, funky((int)myclass::BUFF_SIZE);

I'm not sure which is the better solution.


-- 


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