summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/AST/OperationKinds.def5
-rw-r--r--lib/Sema/SemaCast.cpp5
-rw-r--r--test/CodeGenCXX/builtin-bit-cast-no-tbaa.cpp5
-rw-r--r--test/SemaCXX/constexpr-builtin-bit-cast.cpp16
4 files changed, 24 insertions, 7 deletions
diff --git a/include/clang/AST/OperationKinds.def b/include/clang/AST/OperationKinds.def
index 9af92c1ae7..f29664e8eb 100644
--- a/include/clang/AST/OperationKinds.def
+++ b/include/clang/AST/OperationKinds.def
@@ -66,8 +66,9 @@ CAST_OPERATION(BitCast)
/// bool b; reinterpret_cast<char&>(b) = 'a';
CAST_OPERATION(LValueBitCast)
-/// CK_LValueToRValueBitCast - A conversion that causes us to reinterpret an
-/// lvalue as an rvalue of a different type. Created by __builtin_bit_cast.
+/// CK_LValueToRValueBitCast - A conversion that causes us to reinterpret the
+/// object representation of an lvalue as an rvalue. Created by
+/// __builtin_bit_cast.
CAST_OPERATION(LValueToRValueBitCast)
/// CK_LValueToRValue - A conversion which causes the extraction of
diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp
index 71e5e8e428..8c6abc448d 100644
--- a/lib/Sema/SemaCast.cpp
+++ b/lib/Sema/SemaCast.cpp
@@ -2835,11 +2835,6 @@ void CastOperation::CheckBuiltinBitCast() {
return;
}
- if (Self.Context.hasSameUnqualifiedType(DestType, SrcType)) {
- Kind = CK_NoOp;
- return;
- }
-
Kind = CK_LValueToRValueBitCast;
}
diff --git a/test/CodeGenCXX/builtin-bit-cast-no-tbaa.cpp b/test/CodeGenCXX/builtin-bit-cast-no-tbaa.cpp
index 3f0e490a5f..b26e519bee 100644
--- a/test/CodeGenCXX/builtin-bit-cast-no-tbaa.cpp
+++ b/test/CodeGenCXX/builtin-bit-cast-no-tbaa.cpp
@@ -15,5 +15,10 @@ void test_scalar2() {
// CHECK: load i32, i32* {{.*}}, align 4, !tbaa ![[MAY_ALIAS_TBAA]]
}
+int test_same_type(int &r) {
+ // CHECK: load i32, i32* {{.*}}, align 4, !tbaa ![[MAY_ALIAS_TBAA]]
+ return __builtin_bit_cast(int, r);
+}
+
// CHECK: ![[CHAR_TBAA:.*]] = !{!"omnipotent char", {{.*}}, i64 0}
// CHECK: ![[MAY_ALIAS_TBAA]] = !{![[CHAR_TBAA]], ![[CHAR_TBAA]], i64 0}
diff --git a/test/SemaCXX/constexpr-builtin-bit-cast.cpp b/test/SemaCXX/constexpr-builtin-bit-cast.cpp
index 0a12e7eebe..06771f8f32 100644
--- a/test/SemaCXX/constexpr-builtin-bit-cast.cpp
+++ b/test/SemaCXX/constexpr-builtin-bit-cast.cpp
@@ -381,3 +381,19 @@ constexpr bool test_pad_buffer() {
return x.a == z.a && x.b == z.b;
}
static_assert(test_pad_buffer());
+
+constexpr unsigned char identity1a = 42;
+constexpr unsigned char identity1b = __builtin_bit_cast(unsigned char, identity1a);
+static_assert(identity1b == 42);
+
+struct IdentityInStruct {
+ unsigned char n;
+};
+constexpr IdentityInStruct identity2a = {42};
+constexpr unsigned char identity2b = __builtin_bit_cast(unsigned char, identity2a.n);
+
+union IdentityInUnion {
+ unsigned char n;
+};
+constexpr IdentityInUnion identity3a = {42};
+constexpr unsigned char identity3b = __builtin_bit_cast(unsigned char, identity3a.n);