]> granicus.if.org Git - clang/commitdiff
improve invalid member reference diagnostics to print the type and
authorChris Lattner <sabre@nondot.org>
Mon, 21 Jul 2008 05:35:34 +0000 (05:35 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 21 Jul 2008 05:35:34 +0000 (05:35 +0000)
have better source ranges.  Before:

t.m:11:53: error: member reference is not to a structure or union
    CGFloat maxOffsetY = [_outlineLayer contentSize].height - [_outlineLayer frame].size.height;
                                                    ^~~~~~~

after:

t.m:11:54: error: member reference base type ('id') is not a structure or union
    CGFloat maxOffsetY = [_outlineLayer contentSize].height - [_outlineLayer frame].size.height;
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53834 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticKinds.def
lib/Sema/SemaExpr.cpp

index 2ae518eb48447041bf96b5141585ef3459e7e4db..f68c538b82bbb7230c7e2e3ccdc1c1b07d553b22 100644 (file)
@@ -879,8 +879,8 @@ DIAG(err_typecheck_subscript, ERROR,
      "array subscript is not an integer")
 DIAG(err_typecheck_subscript_not_object, ERROR,
      "illegal subscript of non-object type '%0'")
-DIAG(err_typecheck_member_reference_structUnion, ERROR,
-     "member reference is not to a structure or union")
+DIAG(err_typecheck_member_reference_struct_union, ERROR,
+     "member reference base type ('%0') is not a structure or union")
 DIAG(err_typecheck_member_reference_ivar, ERROR,
      "'%0' does not have a member named '%1'")
 DIAG(err_typecheck_member_reference_arrow, ERROR,
index 9813acbd04511aa8d0d3bdba1bdbc2b4783324c1..9cb8b98f7043f65a38ab512c3cfaeaa3cac666dd 100644 (file)
@@ -588,8 +588,8 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
     if (const PointerType *PT = BaseType->getAsPointerType())
       BaseType = PT->getPointeeType();
     else
-      return Diag(OpLoc, diag::err_typecheck_member_reference_arrow,
-                  SourceRange(MemberLoc));
+      return Diag(MemberLoc, diag::err_typecheck_member_reference_arrow,
+                  BaseType.getAsString(), BaseExpr->getSourceRange());
   }
   
   // Handle field access to simple records.  This also handles access to fields
@@ -602,8 +602,8 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
     // The record definition is complete, now make sure the member is valid.
     FieldDecl *MemberDecl = RDecl->getMember(&Member);
     if (!MemberDecl)
-      return Diag(OpLoc, diag::err_typecheck_no_member, Member.getName(),
-                  SourceRange(MemberLoc));
+      return Diag(MemberLoc, diag::err_typecheck_no_member, Member.getName(),
+                  BaseExpr->getSourceRange());
 
     // Figure out the type of the member; see C99 6.5.2.3p3
     // FIXME: Handle address space modifiers
@@ -622,9 +622,9 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
     if (ObjCIvarDecl *IV = IFTy->getDecl()->lookupInstanceVariable(&Member))
       return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr, 
                                  OpKind == tok::arrow);
-    return Diag(OpLoc, diag::err_typecheck_member_reference_ivar,
+    return Diag(MemberLoc, diag::err_typecheck_member_reference_ivar,
                 IFTy->getDecl()->getName(), Member.getName(),
-                BaseExpr->getSourceRange(), SourceRange(MemberLoc));
+                BaseExpr->getSourceRange());
   }
   
   // Handle Objective-C property access, which is "Obj.property" where Obj is a
@@ -665,16 +665,16 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
     // Component access limited to variables (reject vec4.rg.g).
     if (!isa<DeclRefExpr>(BaseExpr) && !isa<ArraySubscriptExpr>(BaseExpr) &&
         !isa<ExtVectorElementExpr>(BaseExpr))
-      return Diag(OpLoc, diag::err_ext_vector_component_access, 
-                  SourceRange(MemberLoc));
+      return Diag(MemberLoc, diag::err_ext_vector_component_access, 
+                  BaseExpr->getSourceRange());
     QualType ret = CheckExtVectorComponent(BaseType, OpLoc, Member, MemberLoc);
     if (ret.isNull())
       return true;
     return new ExtVectorElementExpr(ret, BaseExpr, Member, MemberLoc);
   }
   
-  return Diag(OpLoc, diag::err_typecheck_member_reference_structUnion,
-              SourceRange(MemberLoc));
+  return Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union,
+              BaseType.getAsString(), BaseExpr->getSourceRange());
 }
 
 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.