From d4224347be04594788fc0f26dff7d2c2cc90851e Mon Sep 17 00:00:00 2001 From: Kaelyn Uhrain Date: Mon, 15 Jul 2013 19:54:54 +0000 Subject: [PATCH] Move the "->" to "." fixit from r186128 into a separate note since recovery is not attempted with the fixit. Also move the associated test case from FixIt/fixit.cpp to SemaCXX/member-expr.cpp since the fixit is no longer automatically applied. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186342 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ lib/Sema/SemaOverload.cpp | 8 +++----- test/FixIt/fixit.cpp | 12 ------------ test/SemaCXX/member-expr.cpp | 16 +++++++++++++++- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index d6b42533a0..5412b2d264 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4241,6 +4241,8 @@ def err_typecheck_member_reference_arrow : Error< "member reference type %0 is not a pointer">; def err_typecheck_member_reference_suggestion : Error< "member reference type %0 is %select{a|not a}1 pointer; maybe you meant to use '%select{->|.}1'?">; +def note_typecheck_member_reference_suggestion : Note< + "did you meant to use '.' instead?">; def err_typecheck_member_reference_type : Error< "cannot refer to type member %0 in %1 with '%select{.|->}2'">; def err_typecheck_member_reference_unknown : Error< diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 01fd582f5e..04aaf181af 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -11355,13 +11355,11 @@ Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) { case OR_No_Viable_Function: if (CandidateSet.empty()) { QualType BaseType = Base->getType(); + Diag(OpLoc, diag::err_typecheck_member_reference_arrow) + << BaseType << Base->getSourceRange(); if (BaseType->isRecordType() && !BaseType->isPointerType()) { - Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) - << BaseType << 1 << Base->getSourceRange() + Diag(OpLoc, diag::note_typecheck_member_reference_suggestion) << FixItHint::CreateReplacement(OpLoc, "."); - } else { - Diag(OpLoc, diag::err_typecheck_member_reference_arrow) - << BaseType << Base->getSourceRange(); } } else Diag(OpLoc, diag::err_ovl_no_viable_oper) diff --git a/test/FixIt/fixit.cpp b/test/FixIt/fixit.cpp index 400c227128..3bd5b57a4e 100644 --- a/test/FixIt/fixit.cpp +++ b/test/FixIt/fixit.cpp @@ -313,18 +313,6 @@ namespace PR5066 { X x; // expected-error {{type-id cannot have a name}} } -namespace PR15045 { - class Cl0 { - public: - int a; - }; - - int f() { - Cl0 c; - return c->a; // expected-error {{member reference type 'PR15045::Cl0' is not a pointer; maybe you meant to use '.'?}} - } -} - namespace PR5898 { class A { public: diff --git a/test/SemaCXX/member-expr.cpp b/test/SemaCXX/member-expr.cpp index 515bcd43b2..faa1171149 100644 --- a/test/SemaCXX/member-expr.cpp +++ b/test/SemaCXX/member-expr.cpp @@ -87,7 +87,8 @@ namespace test5 { } void test2(A &x) { - x->A::foo(); // expected-error {{'test5::A' is not a pointer}} + x->A::foo(); // expected-error {{'test5::A' is not a pointer}} \ + // expected-note {{did you meant to use '.' instead?}} } } @@ -172,3 +173,16 @@ void f(int i) { j = 0; } } + +namespace PR15045 { + class Cl0 { + public: + int a; + }; + + int f() { + Cl0 c; + return c->a; // expected-error {{member reference type 'PR15045::Cl0' is not a pointer}} \ + // expected-note {{did you meant to use '.' instead?}} + } +} -- 2.40.0