diff options
-rw-r--r-- | AST/Type.cpp | 10 | ||||
-rw-r--r-- | Sema/SemaExpr.cpp | 12 |
2 files changed, 17 insertions, 5 deletions
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<ReferenceType>(CanonicalType); + // If this is directly a reference type, return it. + if (const ReferenceType *RTy = dyn_cast<ReferenceType>(this)) + return RTy; + + // If this is a typedef for a reference type, strip the typedef off without + // losing all typedef information. + if (isa<ReferenceType>(CanonicalType)) + return cast<ReferenceType>(cast<TypedefType>(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<ReferenceType>(t.getCanonicalType())) - t = promoteExprToType(e, ref->getReferenceeType()); // C++ [expr] + if (const ReferenceType *ref = dyn_cast<ReferenceType>(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<ArrayType>(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<ReferenceType>(t.getCanonicalType())) - t = promoteExprToType(expr, ref->getReferenceeType()); // C++ [expr] + if (const ReferenceType *ref = dyn_cast<ReferenceType>(t)) { + promoteExprToType(expr, ref->getReferenceeType()); // C++ [expr] + t = expr->getType(); + } if (t->isPromotableIntegerType()) // C99 6.3.1.1p2 promoteExprToType(expr, Context.IntTy); else |