From 8523d20af3815a15574d0cbe26344d9f84438613 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Tue, 13 Oct 2009 21:02:07 +0000 Subject: [PATCH] Pass the right SourceLocation to Actions.ActOnOverloadedOperatorReferenceExpr and Actions.ActOnConversionOperatorReferenceExpr. Update incomplete-call.cpp test. llvm-svn: 84026 --- clang/lib/Parse/ParseExpr.cpp | 6 ++++-- clang/test/SemaCXX/incomplete-call.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index d10e38cf68dc..72e30e3b6079 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -983,12 +983,14 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { } else if (getLang().CPlusPlus && Tok.is(tok::kw_operator)) { // We have a reference to a member operator, e.g., t.operator int or // t.operator+. + SourceLocation OperatorLoc = Tok.getLocation(); + if (OverloadedOperatorKind Op = TryParseOperatorFunctionId()) { if (!LHS.isInvalid()) LHS = Actions.ActOnOverloadedOperatorReferenceExpr(CurScope, move(LHS), OpLoc, OpKind, - Tok.getLocation(), + OperatorLoc, Op, &SS); // TryParseOperatorFunctionId already consumed our token, so // don't bother @@ -997,7 +999,7 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { LHS = Actions.ActOnConversionOperatorReferenceExpr(CurScope, move(LHS), OpLoc, OpKind, - Tok.getLocation(), + OperatorLoc, ConvType, &SS); } else { // Don't emit a diagnostic; ParseConversionFunctionId does it for us diff --git a/clang/test/SemaCXX/incomplete-call.cpp b/clang/test/SemaCXX/incomplete-call.cpp index c61b61a9c649..a9f49d206a1e 100644 --- a/clang/test/SemaCXX/incomplete-call.cpp +++ b/clang/test/SemaCXX/incomplete-call.cpp @@ -1,10 +1,12 @@ // RUN: clang-cc -fsyntax-only -verify %s -struct A; // expected-note 4 {{forward declaration of 'struct A'}} +struct A; // expected-note 6 {{forward declaration of 'struct A'}} A f(); // expected-note {{note: 'f' declared here}} struct B { A f(); // expected-note {{'f' declared here}} + A operator()(); // expected-note {{'operator()' declared here}} + operator A(); // expected-note {{'operator A' declared here}} }; void g() { @@ -17,4 +19,7 @@ void g() { B b; b.f(); // expected-error {{calling 'f' with incomplete return type 'struct A'}} + + b.operator()(); // expected-error {{calling 'operator()' with incomplete return type 'struct A'}} + b.operator A(); // expected-error {{calling 'operator A' with incomplete return type 'struct A'}} }