From: Rafael Espindola Date: Thu, 28 Jun 2012 17:57:36 +0000 (+0000) Subject: Compare the canonical types and document why we give up on the covariant case. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80bc96e6aa9bc8331473385150cff5e0db305da6;p=clang Compare the canonical types and document why we give up on the covariant case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159360 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index 4b0bff0ad0..cb15fe2729 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -202,8 +202,14 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, // we don't have support for that yet, so do a virtual call. DevirtualizedMethod = NULL; } - if (DevirtualizedMethod && DevirtualizedMethod->getResultType() != - MD->getResultType()) + // If the return types are not the same, this might be a case where more + // code needs to run to compensate for it. For example, the derived + // method might return a type that inherits form from the return + // type of MD and has a prefix. + // For now we just avoid devirtualizing these covariant cases. + if (DevirtualizedMethod && + DevirtualizedMethod->getResultType().getCanonicalType() != + MD->getResultType().getCanonicalType()) DevirtualizedMethod = NULL; }