From: Chandler Carruth Date: Tue, 29 Dec 2009 08:05:19 +0000 (+0000) Subject: Fix support for const_cast<>s of array types which actual change the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=595e290bcb69af7ea053fe43f87701ee761d68d3;p=clang Fix support for const_cast<>s of array types which actual change the CV-qualifiers. Remove an error expectation from the 'good' set of const-cast test cases. With this patch, the final non-template test case from PR5542 passes. (It's the same as the one already in const-cast.cpp.) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92257 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp index 045ffb20de..800c544d33 100644 --- a/lib/Sema/SemaCXXCast.cpp +++ b/lib/Sema/SemaCXXCast.cpp @@ -959,8 +959,9 @@ static TryCastResult TryConstCast(Sema &Self, Expr *SrcExpr, QualType DestType, // as must be the final pointee type. while (SrcType != DestType && Self.UnwrapSimilarPointerTypes(SrcType, DestType)) { - SrcType = SrcType.getUnqualifiedType(); - DestType = DestType.getUnqualifiedType(); + Qualifiers Quals; + SrcType = Self.Context.getUnqualifiedArrayType(SrcType, Quals); + DestType = Self.Context.getUnqualifiedArrayType(DestType, Quals); } // Since we're dealing in canonical types, the remainder must be the same. diff --git a/test/SemaCXX/const-cast.cpp b/test/SemaCXX/const-cast.cpp index 74a67e5647..220e6faeee 100644 --- a/test/SemaCXX/const-cast.cpp +++ b/test/SemaCXX/const-cast.cpp @@ -28,8 +28,9 @@ char ***good_const_cast_test(ccvpcvpp var) char ***&var4 = const_cast(var3); // Drop reference. Intentionally without qualifier change. char *** var5 = const_cast(var4); + // Const array to array reference. const int ar[100] = {0}; - int (&rar)[100] = const_cast(ar); // expected-error {{const_cast from 'int const [100]' to 'iarr' (aka 'iar &') is not allowed}} + int (&rar)[100] = const_cast(ar); // Array decay. Intentionally without qualifier change. int *pi = const_cast(ar); f fp = 0;