diff options
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 7 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-expr-4.cpp | 38 |
2 files changed, 44 insertions, 1 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 6ef748cff2..da4fb75b59 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -74,7 +74,7 @@ namespace { OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E); OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E); OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E); - // FIXME: CXXMemberCallExpr + OwningExprResult VisitCXXMemberCallExpr(CXXMemberCallExpr *E); OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E); OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E); OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E); @@ -852,6 +852,11 @@ TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) { } Sema::OwningExprResult +TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { + return VisitCallExpr(E); +} + +Sema::OwningExprResult TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { // Figure out which cast operator we're dealing with. tok::TokenKind Kind; diff --git a/test/SemaTemplate/instantiate-expr-4.cpp b/test/SemaTemplate/instantiate-expr-4.cpp index 0f2bb93f41..d23d01bf3b 100644 --- a/test/SemaTemplate/instantiate-expr-4.cpp +++ b/test/SemaTemplate/instantiate-expr-4.cpp @@ -238,3 +238,41 @@ struct NonDepMemberExpr0 { }; template struct NonDepMemberExpr0<0>; + +template<typename T, typename Result> +struct MemberFuncCall0 { + void f(T t) { + Result result = t.f(); + } +}; + +template<typename T> +struct HasMemFunc0 { + T f(); +}; + + +template struct MemberFuncCall0<HasMemFunc0<int&>, const int&>; + +template<typename Result> +struct ThisMemberFuncCall0 { + Result g(); + + void f() { + Result r1 = g(); + Result r2 = this->g(); + } +}; + +template struct ThisMemberFuncCall0<int&>; + +template<typename T> +struct NonDepMemberCall0 { + void foo(HasMemFunc0<int&> x) { + T result = x.f(); // expected-error{{initialized}} + } +}; + +template struct NonDepMemberCall0<int&>; +template struct NonDepMemberCall0<const int&>; +template struct NonDepMemberCall0<float&>; // expected-note{{instantiation}} |