diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index b6072d8acd5b..206193ba8125 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -752,8 +752,10 @@ OverloadIterator::OverloadIterator(NamedDecl *ND) : D(0) { if (isa(ND) || isa(ND)) D = ND; else if (OverloadedFunctionDecl *Ovl = dyn_cast(ND)) { - D = ND; - Iter = Ovl->function_begin(); + if (Ovl->size() != 0) { + D = ND; + Iter = Ovl->function_begin(); + } } } diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index f1888c87a43f..e7400e74734a 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -4525,16 +4525,12 @@ TreeTransform::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, // used during overload resolution. Sema::FunctionSet Functions; - DeclRefExpr *DRE = cast((Expr *)Callee.get()); - OverloadedFunctionDecl *Overloads - = cast(DRE->getDecl()); + DeclRefExpr *DRE + = cast(((Expr *)Callee.get())->IgnoreParenCasts()); // FIXME: Do we have to check // IsAcceptableNonMemberOperatorCandidate for each of these? - for (OverloadedFunctionDecl::function_iterator - F = Overloads->function_begin(), - FEnd = Overloads->function_end(); - F != FEnd; ++F) + for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) Functions.insert(*F); // Add any functions found via argument-dependent lookup. diff --git a/clang/test/SemaTemplate/instantiate-expr-2.cpp b/clang/test/SemaTemplate/instantiate-expr-2.cpp index 2c3ccb06e420..5351701cdcdc 100644 --- a/clang/test/SemaTemplate/instantiate-expr-2.cpp +++ b/clang/test/SemaTemplate/instantiate-expr-2.cpp @@ -146,3 +146,17 @@ namespace N8 { test_plus(&x, x, x); } } + +namespace N9 { + struct A { + bool operator==(int value); + }; + + template struct B { + bool f(A a) { + return a == 1; + } + }; + + template struct B; +}