Open llvmbot opened 10 years ago
Fixed in r208825, but I'm leaving this open because we're not done here yet. We still incorrectly accept these:
template
struct S { void f(T); }; S<void () const> s1; S<void () &> s2; ... because we don't properly validate the pointer type we build when performing function-to-pointer decay.
Good afternoon,
so, in the context of this question I would like to clarify, that this rule (8.3.1/4):
Forming a reference to function type is ill-formed if the function type has cv-qualifiers or a ref-qualifier
applicable for this code:
#include <iostream>
template <typename F>
void (* test()) (F);
template <typename X>
char (& probe( void(*) ( X * ) ) )[1];
template <typename X>
char (& probe( void(*) ( X ) ) )[2];
int main()
{
std::cout << sizeof(probe(test<void() const>()));
}
in context of C++14 standard (for versions 3.4 and earlier this code prints 1
, 3.5 and higher prints 2
)?
And what about C++03 (in which there is no explicit limitation)? Behaviour whould same, or not?
Fixed in r208825, but I'm leaving this open because we're not done here yet. We still incorrectly accept these:
template<typename T> struct S {
void f(T);
};
S<void () const> s1;
S<void () &> s2;
... because we don't properly validate the pointer type we build when performing function-to-pointer decay.
Extended Description
When compiling the following code using C++11 options:
or using C++1y options:
it is accepted by clang 3.5 trunk 208701 or 3.4 final:
After resolution of CWG 1417,
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1417
the formation of a pointer to function types with cv-qualifier or ref-qualifier (even in template context) is not supported. In non-template context, clang already rejects such an attempt.
The code had been compiled using the online-compiler
http://melpon.org/wandbox/
therefore the provided information about OS and hardware are guesses on my side.