aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Beaumont-Gay <matthewbg@google.com>2012-04-21 01:12:48 +0000
committerMatt Beaumont-Gay <matthewbg@google.com>2012-04-21 01:12:48 +0000
commit7d90fe5a941efc106237d23badec816ed65e267f (patch)
treea3dfc7822b4d8816004fc1f0f4e995543a2af2fd
parent0b1c7156844f1e0e37766a64879b1d1d77fc5385 (diff)
Fix a QoI bug reported by a user.
Set the source location for the "member reference base type ... is not a structure or union" diag to point at the operator rather than the member name. If we're giving this diagnostic because of a typo'd '.' in place of a ';' at the end of a line, the caret previously pointed at the identifier on the following line, which isn't as helpful as it could be. Pointing the caret at the '.' makes it more obvious what the problem is. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155267 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExprMember.cpp4
-rw-r--r--test/SemaCXX/member-expr.cpp10
2 files changed, 12 insertions, 2 deletions
diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp
index 6c84caa3f3..bebb498b64 100644
--- a/lib/Sema/SemaExprMember.cpp
+++ b/lib/Sema/SemaExprMember.cpp
@@ -436,7 +436,7 @@ Sema::ActOnDependentMemberExpr(Expr *BaseExpr, QualType BaseType,
if (PT && (!getLangOpts().ObjC1 ||
PT->getPointeeType()->isRecordType())) {
assert(BaseExpr && "cannot happen with implicit member accesses");
- Diag(NameInfo.getLoc(), diag::err_typecheck_member_reference_struct_union)
+ Diag(OpLoc, diag::err_typecheck_member_reference_struct_union)
<< BaseType << BaseExpr->getSourceRange();
return ExprError();
}
@@ -1418,7 +1418,7 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr,
ObjCImpDecl, HasTemplateArgs);
}
- Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union)
+ Diag(OpLoc, diag::err_typecheck_member_reference_struct_union)
<< BaseType << BaseExpr.get()->getSourceRange();
return ExprError();
diff --git a/test/SemaCXX/member-expr.cpp b/test/SemaCXX/member-expr.cpp
index dbddd1c2e3..763f9c754c 100644
--- a/test/SemaCXX/member-expr.cpp
+++ b/test/SemaCXX/member-expr.cpp
@@ -157,3 +157,13 @@ namespace FuncInMemberExpr {
Vec fun3(int x = 0);
int test3() { return fun3.size(); } // expected-error {{base of member reference is a function; perhaps you meant to call it with no arguments}}
}
+
+namespace DotForSemiTypo {
+void f(int i) {
+ // If the programmer typo'd '.' for ';', make sure we point at the '.' rather
+ // than the "field name" (whatever the first token on the next line happens to
+ // be).
+ int j = i. // expected-error {{member reference base type 'int' is not a structure or union}}
+ j = 0;
+}
+}