forked from OSchip/llvm-project
reinterpret_cast to reference of a bit-field is not allowed.
Fixes rdar://9202628 & http://llvm.org/PR9564. llvm-svn: 130024
This commit is contained in:
parent
9750969178
commit
47a1285a69
|
@ -2879,6 +2879,8 @@ def err_bad_cxx_cast_member_pointer_size : Error<
|
|||
"cannot %select{||reinterpret_cast||C-style cast|}0 from member pointer "
|
||||
"type %1 to member pointer type %2 of different size">;
|
||||
def err_bad_static_cast_incomplete : Error<"%0 is an incomplete type">;
|
||||
def err_bad_reinterpret_cast_bitfield : Error<
|
||||
"reinterpret_cast of a bit-field to %2 needs its address which is not allowed">;
|
||||
|
||||
// These messages don't adhere to the pattern.
|
||||
// FIXME: Display the path somehow better.
|
||||
|
|
|
@ -1326,6 +1326,13 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
|
|||
// C++ 5.2.10p10: [...] a reference cast reinterpret_cast<T&>(x) has the
|
||||
// same effect as the conversion *reinterpret_cast<T*>(&x) with the
|
||||
// built-in & and * operators.
|
||||
|
||||
// Cannot get address of a bitfield.
|
||||
if (SrcExpr.get()->getObjectKind() == OK_BitField) {
|
||||
msg = diag::err_bad_reinterpret_cast_bitfield;
|
||||
return TC_NotApplicable;
|
||||
}
|
||||
|
||||
// This code does this transformation for the checked types.
|
||||
DestType = Self.Context.getPointerType(DestTypeTmp->getPointeeType());
|
||||
SrcType = Self.Context.getPointerType(SrcType);
|
||||
|
|
|
@ -108,3 +108,8 @@ void const_arrays() {
|
|||
(void)reinterpret_cast<char *>(s); // expected-error {{reinterpret_cast from 'const STRING *' (aka 'char const (*)[10]') to 'char *' casts away qualifiers}}
|
||||
(void)reinterpret_cast<const STRING *>(c);
|
||||
}
|
||||
|
||||
namespace PR9564 {
|
||||
struct a { int a : 10; }; a x;
|
||||
int *y = &reinterpret_cast<int&>(x.a); // expected-error {{reinterpret_cast of a bit-field to 'int &' needs its address which is not allowed}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue