[LLVMbugs] [Bug 21405] New: invalid function template argument deduction when used with alias template

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Oct 28 09:55:01 PDT 2014


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

            Bug ID: 21405
           Summary: invalid function template argument deduction when used
                    with alias template
           Product: clang
           Version: 3.4
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
          Assignee: unassignedclangbugs at nondot.org
          Reporter: filip.roseen at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Created attachment 13258
  --> http://llvm.org/bugs/attachment.cgi?id=13258&action=edit
testcase.cpp

template<class T>
using universal_ref = T&&;

template<class T>
void func (universal_ref<T> x) { }

int main () {
  int   a;
  func (a);
}

-------------------------------------------------------------------------------

`clang` inaccurately rejects the above snippet with the following
diagnostic:

  note: candidate function [with T = int] not viable: no
  known conversion from 'int' to 'universal_ref<int>' (aka
  'int &&') for 1st argument void func (universal_ref<T>) {



All of `gcc`, `vc++`, and `icc`, correctly accepts it and effectively
instantiates `func<int&>`.

-------------------------------------------------------------------------------


[temp.deduct.call]p3:

  > If `P` is a cv-qualified type, the top level cv-qualifiers of
  > `P`'s type are ignored for type deduction. If `P` is a reference
  > type, the type referred to by `P` is used for type deduction. If
  > `P` is an rvalue reference to a cv-unqualified template parameter
  > and the argument is an lvalue, the type "lvalue reference to A" is
  > used in place for `A` for type deduction.

[temp.alias]p2:

  > When a template-id refers to the specialization of an alias
  > template, it is equivalent to the associated type obtained by
  > substitution of its template-arguments for the template-parameters
  > in the type-id of the alias template.

-------------------------------------------------------------------------------

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20141028/543f9339/attachment.html>


More information about the llvm-bugs mailing list