From 410a3f3c194a541acb5cdf3b98e96d6078685cf2 Mon Sep 17 00:00:00 2001 From: John McCall Date: Sat, 19 Dec 2009 02:05:44 +0000 Subject: [PATCH] Unresolved implicit member accesses are dependent if the object type is dependent. Avoids an assertion arising during object-argument initialization in overload resolution. In theory we can resolve this at definition time if the class hierarchy for the member is fully known. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91747 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 1 + test/SemaTemplate/member-access-expr.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 7030b7f597..791948fb2b 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -2417,6 +2417,7 @@ Sema::BuildMemberReferenceExpr(ExprArg Base, QualType BaseExprType, // result. if (R.isOverloadedResult() || R.isUnresolvableResult()) { bool Dependent = + BaseExprType->isDependentType() || R.isUnresolvableResult() || UnresolvedLookupExpr::ComputeDependence(R.begin(), R.end(), TemplateArgs); diff --git a/test/SemaTemplate/member-access-expr.cpp b/test/SemaTemplate/member-access-expr.cpp index 51de64a3b4..116e8377b3 100644 --- a/test/SemaTemplate/member-access-expr.cpp +++ b/test/SemaTemplate/member-access-expr.cpp @@ -105,3 +105,17 @@ void test_X5(X5 x5, X5 x5c, X4 *xp, const X4 *cxp) { x5.f(xp); x5c.g(cxp); } + +// In theory we can do overload resolution at template-definition time on this. +// We should at least not assert. +namespace test4 { + struct Base { + template void foo() {} + }; + + template struct Foo : Base { + void test() { + foo(); + } + }; +} -- 2.50.1