Skip to content

Commit d7e4fb0

Browse files
[clang][AST] Handle implicit first argument in CallExpr::getBeginLoc()
Fixes #135522
1 parent 17b4cac commit d7e4fb0

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

clang/lib/AST/Expr.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,8 +1652,11 @@ SourceLocation CallExpr::getBeginLoc() const {
16521652
if (!isTypeDependent()) {
16531653
if (const auto *Method =
16541654
dyn_cast_if_present<const CXXMethodDecl>(getCalleeDecl());
1655-
Method && Method->isExplicitObjectMemberFunction())
1656-
return getArg(0)->getBeginLoc();
1655+
Method && Method->isExplicitObjectMemberFunction()) {
1656+
if (auto FirstArgLoc = getArg(0)->getBeginLoc(); FirstArgLoc.isValid()) {
1657+
return FirstArgLoc;
1658+
}
1659+
}
16571660
}
16581661

16591662
SourceLocation begin = getCallee()->getBeginLoc();

clang/test/SemaCXX/cxx2b-deducing-this.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,3 +1134,10 @@ struct S {
11341134
static_assert((S{} << 11) == a);
11351135
// expected-error@-1 {{use of undeclared identifier 'a'}}
11361136
}
1137+
1138+
namespace GH135522 {
1139+
struct S {
1140+
auto f(this auto) -> S;
1141+
bool g() { return f(); } // expected-error {{no viable conversion from returned value of type 'S' to function return type 'bool'}}
1142+
};
1143+
}

0 commit comments

Comments
 (0)