summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Beaumont-Gay <matthewbg@google.com>2011-03-05 02:42:30 +0000
committerMatt Beaumont-Gay <matthewbg@google.com>2011-03-05 02:42:30 +0000
commitf8bb45f14ded3bccc3db5dff6c4b59d72a7a8316 (patch)
tree29fe34e6724bc6ae66c7fcc6e5447eb32a486290
parent6f9a8f85d764de6072cf1982014163fdbb672efd (diff)
downloadbcm5719-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.cpp21
-rw-r--r--clang/test/SemaCXX/member-expr.cpp5
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?}}
+ }
}
OpenPOWER on IntegriCloud