llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28k stars 11.56k forks source link

Deduction for reference conversion template discards cv-qualifiers #21157

Open hubert-reinterpretcast opened 10 years ago

hubert-reinterpretcast commented 10 years ago
Bugzilla Link 20783
Version trunk
OS All
CC @DougGregor

Extended Description

Template argument deduction for reference conversions do not deduce the correct type with respect to cv-qualifiers of the deduced A.

See N3290 subclause 14.8.2.3 [temp.deduct.conv]; the P/A pair used for type deduction in the case below would be T/const int. Deduction should succeed with T = const int.

As the error message shows, the deduction produced "int" instead of "const int".

SOURCE:

$ cat deduceTemplateConv.cc struct A { template operator T&() { static_assert(sizeof(T) == 0, ""); } }; template <> A::operator const int &(void);

const int &x = A();

COMPILER INVOCATION AND OUTPUT:

$ clang -x c++ -std=c++11 deduceTemplateConv.cc deduceTemplateConv.cc:2:41: error: static_assert failed "" template operator T&() { static_assert(sizeof(T) == 0, ""); } ^ ~~~~~~ deduceTemplateConv.cc:6:16: note: in instantiation of function template specialization 'A::operator int &' requested here const int &x = A(); ^ 1 error generated.

EXPECTED OUTPUT:

Successful compile.

COMPILER VERSION INFO:

$ clang++ -v clang version 3.6.0 (trunk 215824) Target: x86_64-unknown-linux-gnu Thread model: posix Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.0 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 Candidate multilib: .;@m64 Selected multilib: .;@m64

hubert-reinterpretcast commented 2 years ago

mentioned in issue llvm/llvm-bugzilla-archive#32861

hubert-reinterpretcast commented 7 years ago

Bug llvm/llvm-bugzilla-archive#32861 has been marked as a duplicate of this bug.

llvmbot commented 1 year ago

@llvm/issue-subscribers-clang-frontend