[LLVMbugs] [Bug 12683] New: incorrect handling of non-type template parameter packs
    bugzilla-daemon at llvm.org 
    bugzilla-daemon at llvm.org
       
    Fri Apr 27 02:55:35 PDT 2012
    
    
  
http://llvm.org/bugs/show_bug.cgi?id=12683
             Bug #: 12683
           Summary: incorrect handling of non-type template parameter
                    packs
           Product: clang
           Version: trunk
          Platform: PC
        OS/Version: FreeBSD
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: mitchnull+llvm at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified
non-type template parameter pack deduction, or sizeof... gets confused if used
with non-type template parameter(s) with default values, using enable_if.
The following example only works if compiled with -DFOO1.
The second foo() should never get instantiated / considered.
#include <type_traits>
#ifdef FOO1
template <bool... Bs, typename std::enable_if<(sizeof...(Bs) == 1), bool>::type
= false>
void foo() {
        static_assert(sizeof...(Bs) == 1, "sizeof...(Bs) changed during
compilation");
}
#endif
#ifdef FOO2
template <bool... Bs, typename std::enable_if<(sizeof...(Bs) == 2), bool>::type
= false>
void foo() {
        static_assert(sizeof...(Bs) == 2, "sizeof...(Bs) changed during
compilation");
}
#endif
int main() {
        foo<true>();
}
compiler output (FOO1):
$ ~/llvm-clang-3.1-rc1-freebsd9-i386/bin/clang++ -I. -DFOO1  -std=c++11 -o sf1
sf1.cpp
compiler output (FOO2):
$ ~/llvm-clang-3.1-rc1-freebsd9-i386/bin/clang++ -I. -DFOO2  -std=c++11 -o sf1
sf1.cpp
sf1.cpp:13:2: error: static_assert failed "sizeof...(Bs) changed during
compilation"
        static_assert(sizeof...(Bs) == 2, "sizeof...(Bs) changed during
compilation");
        ^             ~~~~~~~~~~~~~~~~~~
sf1.cpp:18:2: note: in instantiation of function template specialization
'foo<true, false>' requested here
        foo<true>();
        ^
1 error generated.
compiler output (FOO1 and FOO2):
$ ~/llvm-clang-3.1-rc1-freebsd9-i386/bin/clang++ -I. -DFOO1 -DFOO2  -std=c++11
-o sf1 sf1.cpp
sf1.cpp:18:2: error: call to 'foo' is ambiguous
        foo<true>();
        ^~~~~~~~~
sf1.cpp:5:6: note: candidate function [with Bs = <true>, $1 = false]
void foo() {
     ^
sf1.cpp:12:6: note: candidate function [with Bs = <true>, $1 = false]
void foo() {
     ^
1 error generated.
-- 
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.
    
    
More information about the llvm-bugs
mailing list