[cfe-commits] r88848 - in /cfe/trunk: lib/Sema/SemaCXXCast.cpp test/SemaCXX/static-cast.cpp
Daniel Dunbar
daniel at zuster.org
Mon Nov 16 09:53:40 PST 2009
On Sun, Nov 15, 2009 at 2:20 AM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Sun Nov 15 03:20:52 2009
> New Revision: 88848
>
> URL: http://llvm.org/viewvc/llvm-project?rev=88848&view=rev
> Log:
> When performing a static downcast as part of a static_cast, make sure
> that we're dealing with canonical types like the documentation say
> (yay, CanQualType). Alas, this is another instance where using
> getQualifiers() on a non-canonical QualType got us in trouble.
>
> Good news: with this fix, Clang can now parse all of its own headers!
Woot! Very cool Doug!
- Daniel
> Modified:
> cfe/trunk/lib/Sema/SemaCXXCast.cpp
> cfe/trunk/test/SemaCXX/static-cast.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaCXXCast.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXCast.cpp?rev=88848&r1=88847&r2=88848&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaCXXCast.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaCXXCast.cpp Sun Nov 15 03:20:52 2009
> @@ -77,8 +77,8 @@
> const SourceRange &OpRange,
> unsigned &msg,
> CastExpr::CastKind &Kind);
> -static TryCastResult TryStaticDowncast(Sema &Self, QualType SrcType,
> - QualType DestType, bool CStyle,
> +static TryCastResult TryStaticDowncast(Sema &Self, CanQualType SrcType,
> + CanQualType DestType, bool CStyle,
> const SourceRange &OpRange,
> QualType OrigSrcType,
> QualType OrigDestType, unsigned &msg,
> @@ -190,7 +190,8 @@
> assert((DestType->isPointerType() || DestType->isMemberPointerType()) &&
> "Destination type is not pointer or pointer to member.");
>
> - QualType UnwrappedSrcType = SrcType, UnwrappedDestType = DestType;
> + QualType UnwrappedSrcType = Self.Context.getCanonicalType(SrcType),
> + UnwrappedDestType = Self.Context.getCanonicalType(DestType);
> llvm::SmallVector<Qualifiers, 8> cv1, cv2;
>
> // Find the qualifications.
> @@ -573,7 +574,9 @@
>
> QualType DestPointee = DestReference->getPointeeType();
>
> - return TryStaticDowncast(Self, SrcExpr->getType(), DestPointee, CStyle,
> + return TryStaticDowncast(Self,
> + Self.Context.getCanonicalType(SrcExpr->getType()),
> + Self.Context.getCanonicalType(DestPointee), CStyle,
> OpRange, SrcExpr->getType(), DestType, msg, Kind);
> }
>
> @@ -601,16 +604,17 @@
> return TC_NotApplicable;
> }
>
> - return TryStaticDowncast(Self, SrcPointer->getPointeeType(),
> - DestPointer->getPointeeType(), CStyle,
> - OpRange, SrcType, DestType, msg, Kind);
> + return TryStaticDowncast(Self,
> + Self.Context.getCanonicalType(SrcPointer->getPointeeType()),
> + Self.Context.getCanonicalType(DestPointer->getPointeeType()),
> + CStyle, OpRange, SrcType, DestType, msg, Kind);
> }
>
> /// TryStaticDowncast - Common functionality of TryStaticReferenceDowncast and
> /// TryStaticPointerDowncast. Tests whether a static downcast from SrcType to
> -/// DestType, both of which must be canonical, is possible and allowed.
> +/// DestType is possible and allowed.
> TryCastResult
> -TryStaticDowncast(Sema &Self, QualType SrcType, QualType DestType,
> +TryStaticDowncast(Sema &Self, CanQualType SrcType, CanQualType DestType,
> bool CStyle, const SourceRange &OpRange, QualType OrigSrcType,
> QualType OrigDestType, unsigned &msg,
> CastExpr::CastKind &Kind) {
> @@ -620,7 +624,7 @@
> return TC_NotApplicable;
>
> // Downcast can only happen in class hierarchies, so we need classes.
> - if (!DestType->isRecordType() || !SrcType->isRecordType()) {
> + if (!DestType->getAs<RecordType>() || !SrcType->getAs<RecordType>()) {
> return TC_NotApplicable;
> }
>
> @@ -676,12 +680,13 @@
> EE = PI->rend();
> EI != EE; ++EI)
> PathDisplayStr += EI->Base->getType().getAsString() + " -> ";
> - PathDisplayStr += DestType.getAsString();
> + PathDisplayStr += QualType(DestType).getAsString();
> }
> }
>
> Self.Diag(OpRange.getBegin(), diag::err_ambiguous_base_to_derived_cast)
> - << SrcType.getUnqualifiedType() << DestType.getUnqualifiedType()
> + << QualType(SrcType).getUnqualifiedType()
> + << QualType(DestType).getUnqualifiedType()
> << PathDisplayStr << OpRange;
> msg = 0;
> return TC_Failed;
>
> Modified: cfe/trunk/test/SemaCXX/static-cast.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/static-cast.cpp?rev=88848&r1=88847&r2=88848&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/static-cast.cpp (original)
> +++ cfe/trunk/test/SemaCXX/static-cast.cpp Sun Nov 15 03:20:52 2009
> @@ -1,5 +1,4 @@
> // RUN: clang-cc -fsyntax-only -verify -faccess-control %s
> -
> struct A {};
> struct B : public A {}; // Single public base.
> struct C1 : public virtual B {}; // Single virtual base.
> @@ -162,3 +161,20 @@
> void test_ctor_init() {
> (void)static_cast<X1>(X1());
> }
> +
> +// Casting away constness
> +struct X2 {
> +};
> +
> +struct X3 : X2 {
> +};
> +
> +struct X4 {
> + typedef const X3 X3_typedef;
> +
> + void f() const {
> + (void)static_cast<X3_typedef*>(x2);
> + }
> +
> + const X2 *x2;
> +};
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list