]> granicus.if.org Git - clang/commitdiff
Fix crash due to missing array-to-pointer decay when instantiating an unresolved
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 26 Oct 2011 06:49:26 +0000 (06:49 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 26 Oct 2011 06:49:26 +0000 (06:49 +0000)
member expression. Refactoring to follow.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143017 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaTemplate/instantiate-expr-4.cpp

index 7fb2d35c70671114dbe7433682207de8ab139f89..6fb1315c2ed2186cc6dc16eaa9424e347b5f3639 100644 (file)
@@ -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());
   }
index 9483f9b2836613771c51e90fc6b6d4e5c0352afa..d95ccfecd9b5898704c49bbc340caa12257c58bc 100644 (file)
@@ -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);