[LLVMbugs] [Bug 15064] New: erroneous substitution failure

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri Jan 25 06:12:45 PST 2013


             Bug #: 15064
           Summary: erroneous substitution failure
           Product: clang
           Version: unspecified
          Platform: PC
        OS/Version: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: joerg.richter at pdv-fs.de
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

cat > t.cc <<EOF
template<class T, class Enable = void> struct CFooEnabler {};

struct CFoo
    template<class T> inline CFoo( T const& t, typename CFooEnabler<T>::Enable*
= 0 );
    char const* data() const;
    int size() const;

template<> struct CFooEnabler<char const*>
    typedef void Enable;
    static char const* extract( char const* val );

template<class T, class Enable = void> struct FooEnabler {};
struct Foo
    template<class T> inline
    Foo( T const& t, typename FooEnabler<T>::Enable* = 0 );
    Foo( char const* str, int size );

template<> struct FooEnabler<CFoo>
    typedef void Enable;
    static Foo extract( CFoo val )     // make this a declaration and it works
      return Foo( val.data(), val.size() );

template<class T>
struct FooEnabler<T, typename CFooEnabler<T>::Enable> : FooEnabler<CFoo> {};

void func()
  char const* a = "";
  Foo xx( a );

clang++ t.cc     # version from 2013-01-25

Gives following output:
t.cc:39:7: error: no matching constructor for initialization of 'Foo'
  Foo xx( a );
      ^   ~
t.cc:17:8: note: candidate constructor (the implicit copy constructor) not
viable: no known conversion from
      'const char *' to 'const Foo' for 1st argument
struct Foo
t.cc:20:5: note: candidate template ignored: substitution failure [with T =
const char *]: no type named 'Enable' in
      'FooEnabler<const char *, void>'
    Foo( T const& t, typename FooEnabler<T>::Enable* = 0 );
    ^                                        ~~~~~~
t.cc:21:5: note: candidate constructor not viable: requires 2 arguments, but 1
was provided
    Foo( char const* str, int size );
1 error generated.

I think
   Foo( T const& t, typename FooEnabler<T>::Enable* = 0 );
should match.  At least GCC 4.7.2 supports my opinion.

Please see the comment on FooEnabled<CFoo>::extract member function.

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