mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-30 14:06:08 +00:00

(e.g., a call, cast, etc.), immediately adjust the expression's type to strip cv-qualifiers off of all non-class types (in C++) or all types (in C). This effectively extends my previous fix for PR7463, which was restricted to calls, to other kinds of expressions within similar characteristics. I've audited every use of getNonReferenceType() in the code base, switching to the newly-renamed getNonLValueExprType() where necessary. Big thanks to Eli for pointing out just how incomplete my original fix for PR7463 actually was. We've been handling cv-qualifiers on rvalues wrong for a very, very long time. Fixes PR7463. llvm-svn: 108253
25 lines
984 B
C++
25 lines
984 B
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
// PR7463: Make sure that when we have an rvalue, it does not have
|
|
// cv-qualified non-class type.
|
|
template <typename T_> void g (T_&); // expected-note 7{{not viable}}
|
|
|
|
template<const int X> void h() {
|
|
g(X); // expected-error{{no matching function for call to 'g'}}
|
|
}
|
|
|
|
template<typename T, T X> void h2() {
|
|
g(X); // expected-error{{no matching function for call to 'g'}}
|
|
}
|
|
|
|
void a(__builtin_va_list x) {
|
|
g(__builtin_va_arg(x, const int)); // expected-error{{no matching function for call to 'g'}}
|
|
g((const int)0); // expected-error{{no matching function for call to 'g'}}
|
|
typedef const int cint;
|
|
g(cint(0)); // expected-error{{no matching function for call to 'g'}}
|
|
g(static_cast<const int>(1)); // expected-error{{no matching function for call to 'g'}}
|
|
g(reinterpret_cast<int *const>(0)); // expected-error{{no matching function for call to 'g'}}
|
|
h<0>();
|
|
h2<const int, 0>(); // expected-note{{instantiation of}}
|
|
}
|