aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-10-26 06:49:26 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-10-26 06:49:26 +0000
commitf1f6d85694fcf772f6d602fd9709318b08b96328 (patch)
tree8117476e6ff0e8d6ab0a411a02aec53789932353
parent601d2ee8dd783503f9d556e1ed3b107abf196a1e (diff)
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
-rw-r--r--lib/Sema/TreeTransform.h11
-rw-r--r--test/SemaTemplate/instantiate-expr-4.cpp10
2 files changed, 18 insertions, 3 deletions
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<Derived>::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<ArrowWrapper<MemIntFunc*>, int (*)(int)>;
template struct ArrowMemRef0<ArrowWrapper<MemInt*>, float&>; // expected-note{{instantiation}}
template struct ArrowMemRef0<ArrowWrapper<ArrowWrapper<MemInt*> >, int&>;
+struct UnresolvedMemRefArray {
+ int f(int);
+ int f(char);
+};
+UnresolvedMemRefArray Arr[10];
+template<typename U> int UnresolvedMemRefArrayT(U u) {
+ return Arr->f(u);
+}
+template int UnresolvedMemRefArrayT<int>(int);
+
// FIXME: we should be able to return a MemInt without the reference!
MemInt &createMemInt(int);