]> granicus.if.org Git - clang/commitdiff
When deciding whether reinterpret_cast casts away constness we need to look at array...
authorAnders Carlsson <andersca@mac.com>
Fri, 4 Jun 2010 22:47:55 +0000 (22:47 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 4 Jun 2010 22:47:55 +0000 (22:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105494 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaCXXCast.cpp
test/SemaCXX/reinterpret-cast.cpp

index 9b95552554897e154d641ecca72148c94c57585e..5485bb3e17ac9a48ef869d0c544d73cfc52b5a14 100644 (file)
@@ -257,8 +257,13 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType) {
 
   // Find the qualifications.
   while (UnwrapDissimilarPointerTypes(UnwrappedSrcType, UnwrappedDestType)) {
-    cv1.push_back(UnwrappedSrcType.getQualifiers());
-    cv2.push_back(UnwrappedDestType.getQualifiers());
+    Qualifiers SrcQuals;
+    Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
+    cv1.push_back(SrcQuals);
+    
+    Qualifiers DestQuals;
+    Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
+    cv2.push_back(DestQuals);
   }
   assert(cv1.size() > 0 && "Must have at least one pointer level.");
 
index 45d41e84601a843358d01a1046b1e5454371fa4e..f054e528d2d8463ff810788ffdd73300cfb6c10f 100644 (file)
@@ -91,8 +91,20 @@ void memptrs()
   (void)reinterpret_cast<int structure::*>(0); // expected-error {{reinterpret_cast from 'int' to 'int structure::*' is not allowed}}
 }
 
+namespace PR5545 {
 // PR5545
 class A;
 class B;
 void (A::*a)();
 void (B::*b)() = reinterpret_cast<void (B::*)()>(a);
+}
+
+// <rdar://problem/8018292>
+void const_arrays() {
+  typedef char STRING[10];
+  const STRING *s;
+  const char *c;
+
+  (void)reinterpret_cast<char *>(s); // expected-error {{reinterpret_cast from 'STRING const *' (aka 'char const (*)[10]') to 'char *' casts away constness}}
+  (void)reinterpret_cast<const STRING *>(c);
+}