Author: akirtzidis Date: Fri Apr 22 17:31:13 2011 New Revision: 130024 URL: http://llvm.org/viewvc/llvm-project?rev=130024&view=rev Log: reinterpret_cast to reference of a bit-field is not allowed.
Fixes rdar://9202628 & http://llvm.org/PR9564. Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaCXXCast.cpp cfe/trunk/test/SemaCXX/reinterpret-cast.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=130024&r1=130023&r2=130024&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Apr 22 17:31:13 2011 @@ -2879,6 +2879,8 @@ "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. Modified: cfe/trunk/lib/Sema/SemaCXXCast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXCast.cpp?rev=130024&r1=130023&r2=130024&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaCXXCast.cpp (original) +++ cfe/trunk/lib/Sema/SemaCXXCast.cpp Fri Apr 22 17:31:13 2011 @@ -1326,6 +1326,13 @@ // 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); Modified: cfe/trunk/test/SemaCXX/reinterpret-cast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/reinterpret-cast.cpp?rev=130024&r1=130023&r2=130024&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/reinterpret-cast.cpp (original) +++ cfe/trunk/test/SemaCXX/reinterpret-cast.cpp Fri Apr 22 17:31:13 2011 @@ -108,3 +108,8 @@ (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}} +} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
