From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1546 invoked by alias); 26 Jul 2010 15:25:33 -0000 Received: (qmail 1134 invoked by uid 48); 26 Jul 2010 15:25:21 -0000 Date: Mon, 26 Jul 2010 15:25:00 -0000 Subject: [Bug c++/45082] New: Static const signed int class member causes undefined symbol. X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "rwitmer at xmission dot com" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2010-07/txt/msg02875.txt.bz2 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