[LLVMbugs] [Bug 15042] New: Clang interprets exception spec as functional cast

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Jan 22 09:32:46 PST 2013


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

             Bug #: 15042
           Summary: Clang interprets exception spec as functional cast
           Product: clang
           Version: 3.0
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++11
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: steveire at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified


$ clang++ --version
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: x86_64-pc-linux-gnu
Thread model: posix


While attempting to implement a feature, I hit 
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56071 in g++, though that seems 
to work with clang, and I hit other bugs in clang, which work with g++.

With this code:

  class B
  {
    template <typename T> friend struct A;
  private:
      B(int, char) {}
      ~B() {}
  };

  template <typename T>
  struct A
  {
      T t;
      template<typename... Args>
      A(Args&&... args) noexcept(noexcept(T(std::forward<Args>(args)...)))
        : t(std::forward<Args>(args)...)
      {}
  };

  struct C {
    A<B> delegate;

    template<typename... Args>
    C(Args&&... args)
        noexcept(noexcept(A<B>(std::forward<Args>(args)...)))
        : delegate(std::forward<Args>(args)...)
      { }
  };

  #endif

  int main() {
    A<B> ab(42, 'f'); // Works
    C c(42, 'f'); // Fails

    return 0;
  }


I get this error with clang:

  other.cpp:59:41: error: no matching conversion for functional-style cast 
from 'const A<B>' to 'B'
    A(Args&&... args) noexcept(noexcept(T(std::forward<Args>(args)...)))


If I try using uniform-initialization instead, I get this:

  other.cpp:59:41: error: 'T' does not refer to a value
    A(Args&&... args) noexcept(noexcept(T{std::forward<Args>(args)...}))

-- 
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