summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaCXXCast.cpp6
-rw-r--r--clang/test/CodeGenCXX/casts.cpp6
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;
+}
OpenPOWER on IntegriCloud