diff options
author | Matt Beaumont-Gay <matthewbg@google.com> | 2011-03-05 02:42:30 +0000 |
---|---|---|
committer | Matt Beaumont-Gay <matthewbg@google.com> | 2011-03-05 02:42:30 +0000 |
commit | f8bb45f14ded3bccc3db5dff6c4b59d72a7a8316 (patch) | |
tree | 29fe34e6724bc6ae66c7fcc6e5447eb32a486290 | |
parent | 6f9a8f85d764de6072cf1982014163fdbb672efd (diff) | |
download | bcm5719-llvm-f8bb45f14ded3bccc3db5dff6c4b59d72a7a8316.tar.gz bcm5719-llvm-f8bb45f14ded3bccc3db5dff6c4b59d72a7a8316.zip |
Much to my surprise, OverloadExprs can also point to function template decls.
llvm-svn: 127061
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 21 | ||||
-rw-r--r-- | clang/test/SemaCXX/member-expr.cpp | 5 |
2 files changed, 17 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3da647acb2e..f97d1a8f128 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4017,21 +4017,24 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr, bool HasViableZeroArgOverload = false; for (OverloadExpr::decls_iterator it = AllOverloads.begin(), DeclsEnd = AllOverloads.end(); it != DeclsEnd; ++it) { - const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*it); - QualType ResultTy = OverloadDecl->getResultType(); - if ((!IsArrow && ResultTy->isRecordType()) || - (IsArrow && ResultTy->isPointerType() && - ResultTy->getPointeeType()->isRecordType())) { - ViableOverloads.addDecl(*it); - if (OverloadDecl->getMinRequiredArguments() == 0) { - HasViableZeroArgOverload = true; + // Our overload set may include TemplateDecls, which we'll ignore for the + // purposes of determining whether we can issue a '()' fixit. + if (const FunctionDecl *OverloadDecl = dyn_cast<FunctionDecl>(*it)) { + QualType ResultTy = OverloadDecl->getResultType(); + if ((!IsArrow && ResultTy->isRecordType()) || + (IsArrow && ResultTy->isPointerType() && + ResultTy->getPointeeType()->isRecordType())) { + ViableOverloads.addDecl(*it); + if (OverloadDecl->getMinRequiredArguments() == 0) { + HasViableZeroArgOverload = true; + } } } } if (!HasViableZeroArgOverload || ViableOverloads.size() != 1) { Diag(BaseExpr->getExprLoc(), diag::err_member_reference_needs_call) - << 1 << 0 + << (AllOverloads.size() > 1) << 0 << BaseExpr->getSourceRange(); int ViableOverloadCount = ViableOverloads.size(); int I; diff --git a/clang/test/SemaCXX/member-expr.cpp b/clang/test/SemaCXX/member-expr.cpp index 3c3eb04e08f..68af4152ef4 100644 --- a/clang/test/SemaCXX/member-expr.cpp +++ b/clang/test/SemaCXX/member-expr.cpp @@ -135,4 +135,9 @@ namespace PR9025 { int g3() { return fun3.x; // expected-error{{base of member reference is an overloaded function; perhaps you meant to call it with no arguments?}} } + + template <typename T> S fun4(); + int g4() { + return fun4.x; // expected-error{{base of member reference is a function; perhaps you meant to call it?}} + } } |