]> granicus.if.org Git - clang/commitdiff
reinterpret_cast to reference of a bit-field is not allowed.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 22 Apr 2011 22:31:13 +0000 (22:31 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 22 Apr 2011 22:31:13 +0000 (22:31 +0000)
Fixes rdar://9202628 & http://llvm.org/PR9564.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130024 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaCXXCast.cpp
test/SemaCXX/reinterpret-cast.cpp

index dbc30c0dfb656038e201bc44ab01540d14b39954..6e130b179727c956efc629b09a58264ee952beb5 100644 (file)
@@ -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.
index a0d1514bd0b42b1551587b18fd50c6863be78336..29475539d719935730357b6c232a3573c87bcaa8 100644 (file)
@@ -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);
index 9e5211cb1b2c226c3a734ffd0ac789a3c8335b26..2ec45b37cde646069d393d33442cd293aeae2047 100644 (file)
@@ -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}}
+}