http://llvm.org/bugs/show_bug.cgi?id=9999

           Summary: A simple recursive TMP static const initializer
                    defeats clang.
           Product: clang
           Version: 2.8
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected], [email protected]


Created an attachment (id=6635)
 --> (http://llvm.org/bugs/attachment.cgi?id=6635)
Test program to illustrate the problem built with clang -c testit.cpp

clang version 2.8 (branches/release_28)
Target: i386-pc-linux-gnu
Thread model: posix

This works on gcc but not on clang:

template<unsigned int v>
class bitWidthHolding {
public:
    /** width is the number of bits occupied by the template parameter v
        */
    static const
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
};

static const int width=bitWidthHolding<255>::width;

Error is: 
patrick@dell$ clang -c testit.cpp
testit.cpp:7:67: error: in-class initializer is not an integral constant
      expression
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<0>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<1>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<3>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<7>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<15>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<31>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class 'bitWidthHolding<63>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:7:40: note: in instantiation of template class
'bitWidthHolding<127>'
      requested here
    unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
                                       ^
testit.cpp:10:24: note: in instantiation of template class
      'bitWidthHolding<255>' requested here
static const int width=bitWidthHolding<255>::width;
                       ^
1 error generated.

The real error is the top one, which should be static const int 0, and is not
recognized as const.  For us it's a showstopper, we can't use clang because of
this.

-- 
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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to