diff options
-rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/casts.cpp | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 92eb1740c97..c9b3b8ec34a 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/lib/Sema/SemaCXXCast.cpp @@ -1053,8 +1053,11 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr, return TC_NotApplicable; // If both types have the same size, we can successfully cast. - if (Self.Context.getTypeSize(SrcType) == Self.Context.getTypeSize(DestType)) + if (Self.Context.getTypeSize(SrcType) + == Self.Context.getTypeSize(DestType)) { + Kind = CastExpr::CK_BitCast; return TC_Success; + } if (destIsScalar) msg = diag::err_bad_cxx_cast_vector_to_scalar_different_size; @@ -1083,6 +1086,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr, // to the same type. However, the behavior of compilers is pretty consistent // on this point: allow same-type conversion if the involved types are // pointers, disallow otherwise. + Kind = CastExpr::CK_NoOp; return TC_Success; } diff --git a/clang/test/CodeGenCXX/casts.cpp b/clang/test/CodeGenCXX/casts.cpp index 91ae6af19e0..436b722e69d 100644 --- a/clang/test/CodeGenCXX/casts.cpp +++ b/clang/test/CodeGenCXX/casts.cpp @@ -5,6 +5,8 @@ namespace PR5248 { struct A { void copyFrom(const A &src); void addRef(void); + + A& operator=(int); }; void A::copyFrom(const A &src) { @@ -12,3 +14,7 @@ void A::copyFrom(const A &src) { } } +// reinterpret_cast to self +void test(PR5248::A* a) { + reinterpret_cast<PR5248::A&>(*a) = 17; +} |