From: Bill Wendling Date: Tue, 17 Jul 2007 04:16:47 +0000 (+0000) Subject: Change dyn_cast for reference types to be more like pointers and not need the canonic... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1;p=clang Change dyn_cast for reference types to be more like pointers and not need the canonical type. Also fix so that we're not expecting a return value from a void function git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39954 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Type.cpp b/AST/Type.cpp index 7b999faa66..f083a73fdc 100644 --- a/AST/Type.cpp +++ b/AST/Type.cpp @@ -73,7 +73,15 @@ const PointerType *Type::isPointerType() const { } bool Type::isReferenceType() const { - return isa(CanonicalType); + // If this is directly a reference type, return it. + if (const ReferenceType *RTy = dyn_cast(this)) + return RTy; + + // If this is a typedef for a reference type, strip the typedef off without + // losing all typedef information. + if (isa(CanonicalType)) + return cast(cast(this)->LookThroughTypedefs()); + return 0; } bool Type::isArrayType() const { diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 93a2df90aa..952c83fcf1 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -597,8 +597,10 @@ void Sema::DefaultFunctionArrayConversion(Expr *&e) { QualType t = e->getType(); assert(!t.isNull() && "DefaultFunctionArrayConversion - missing type"); - if (const ReferenceType *ref = dyn_cast(t.getCanonicalType())) - t = promoteExprToType(e, ref->getReferenceeType()); // C++ [expr] + if (const ReferenceType *ref = dyn_cast(t)) { + promoteExprToType(e, ref->getReferenceeType()); // C++ [expr] + t = e->getType(); + } if (t->isFunctionType()) promoteExprToType(e, Context.getPointerType(t)); else if (const ArrayType *ary = dyn_cast(t.getCanonicalType())) @@ -614,8 +616,10 @@ void Sema::UsualUnaryConversions(Expr *&expr) { QualType t = expr->getType(); assert(!t.isNull() && "UsualUnaryConversions - missing type"); - if (const ReferenceType *ref = dyn_cast(t.getCanonicalType())) - t = promoteExprToType(expr, ref->getReferenceeType()); // C++ [expr] + if (const ReferenceType *ref = dyn_cast(t)) { + promoteExprToType(expr, ref->getReferenceeType()); // C++ [expr] + t = expr->getType(); + } if (t->isPromotableIntegerType()) // C99 6.3.1.1p2 promoteExprToType(expr, Context.IntTy); else