You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When compiling the following code using C++11 options:
-Wall -Wextra -std=c++11 -pedantic
or using C++1y options:
-Wall -Wextra -std=c++1y -pedantic
it is accepted by clang 3.5 trunk 208701 or 3.4 final:
//---------------------
template
struct add_ptr
{
using type = T*;
};
int main() {
using FC = void () const;
using PFC = add_ptr::type;
using FLR = void () &;
using PFLR = add_ptr::type;
using FRR = void () &&;
using PFRR = add_ptr::type;
}
//---------------------
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
... 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
template
void (* test()) (F);
template
char (& probe( void(*) ( X * ) ) )[1];
template
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?
llvmbot
transferred this issue from llvm/llvm-bugzilla-archive
Dec 9, 2021
Extended Description
When compiling the following code using C++11 options:
-Wall -Wextra -std=c++11 -pedantic
or using C++1y options:
-Wall -Wextra -std=c++1y -pedantic
it is accepted by clang 3.5 trunk 208701 or 3.4 final:
//---------------------
template
struct add_ptr
{
using type = T*;
};
int main() {
using FC = void () const;
using PFC = add_ptr::type;
using FLR = void () &;
using PFLR = add_ptr::type;
using FRR = void () &&;
using PFRR = add_ptr::type;
}
//---------------------
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.
The text was updated successfully, but these errors were encountered: