From: Richard Smith Date: Wed, 26 Oct 2011 06:49:26 +0000 (+0000) Subject: Fix crash due to missing array-to-pointer decay when instantiating an unresolved X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f1f6d85694fcf772f6d602fd9709318b08b96328;p=clang Fix crash due to missing array-to-pointer decay when instantiating an unresolved member expression. Refactoring to follow. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143017 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 7fb2d35c70..6fb1315c2e 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -2145,11 +2145,17 @@ public: CXXScopeSpec SS; SS.Adopt(QualifierLoc); - if (BaseE && IsArrow) { - ExprResult BaseResult = getSema().DefaultLvalueConversion(BaseE); + if (BaseE) { + ExprResult BaseResult = getSema().DefaultFunctionArrayConversion(BaseE); if (BaseResult.isInvalid()) return ExprError(); + if (IsArrow) { + BaseResult = getSema().DefaultLvalueConversion(BaseResult.take()); + if (BaseResult.isInvalid()) + return ExprError(); + } BaseE = BaseResult.take(); + BaseType = BaseE->getType(); } return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, @@ -7701,7 +7707,6 @@ TreeTransform::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) Base = getDerived().TransformExpr(Old->getBase()); if (Base.isInvalid()) return ExprError(); - BaseType = ((Expr*) Base.get())->getType(); } else { BaseType = getDerived().TransformType(Old->getBaseType()); } diff --git a/test/SemaTemplate/instantiate-expr-4.cpp b/test/SemaTemplate/instantiate-expr-4.cpp index 9483f9b283..d95ccfecd9 100644 --- a/test/SemaTemplate/instantiate-expr-4.cpp +++ b/test/SemaTemplate/instantiate-expr-4.cpp @@ -282,6 +282,16 @@ template struct ArrowMemRef0, int (*)(int)>; template struct ArrowMemRef0, float&>; // expected-note{{instantiation}} template struct ArrowMemRef0 >, int&>; +struct UnresolvedMemRefArray { + int f(int); + int f(char); +}; +UnresolvedMemRefArray Arr[10]; +template int UnresolvedMemRefArrayT(U u) { + return Arr->f(u); +} +template int UnresolvedMemRefArrayT(int); + // FIXME: we should be able to return a MemInt without the reference! MemInt &createMemInt(int);