forked from OSchip/llvm-project
Print source location in the error message when parens are missing around sizeof typename and the expression is inside macro expansion
Given the following code: ``` void Foo(int); void Baz() { Bar(sizeof int); } ``` The error message which is printed today is this: ``` error: expected parentheses around type name in sizeof expression ``` There is no source location printed whatsoever, so fixing a compile break like this becomes extremely hard in a large codebase. My change improves the error message. But it doesn't output a FixItHint because I wasn't able to figure out how to get the locations for left and right parens. So any tips would be appreciated. ``` <source>:7:6: error: expected parentheses around type name in sizeof expression Bar(sizeof int); ^ ``` Reviewed By: rsmith Differential Revision: https://reviews.llvm.org/D91129
This commit is contained in:
parent
735ab86b81
commit
e53b9f733a
|
@ -2266,10 +2266,15 @@ Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
|
|||
|
||||
SourceLocation LParenLoc = PP.getLocForEndOfToken(OpTok.getLocation());
|
||||
SourceLocation RParenLoc = PP.getLocForEndOfToken(PrevTokLocation);
|
||||
Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
|
||||
<< OpTok.getName()
|
||||
<< FixItHint::CreateInsertion(LParenLoc, "(")
|
||||
<< FixItHint::CreateInsertion(RParenLoc, ")");
|
||||
if (LParenLoc.isInvalid() || RParenLoc.isInvalid()) {
|
||||
Diag(OpTok.getLocation(),
|
||||
diag::err_expected_parentheses_around_typename)
|
||||
<< OpTok.getName();
|
||||
} else {
|
||||
Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
|
||||
<< OpTok.getName() << FixItHint::CreateInsertion(LParenLoc, "(")
|
||||
<< FixItHint::CreateInsertion(RParenLoc, ")");
|
||||
}
|
||||
isCastExpr = true;
|
||||
return ExprEmpty();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
void Foo(int);
|
||||
|
||||
#define Bar(x) Foo(x)
|
||||
|
||||
void Baz() {
|
||||
Foo(sizeof int); // expected-error {{expected parentheses around type name in sizeof expression}}
|
||||
Bar(sizeof int); // expected-error {{expected parentheses around type name in sizeof expression}}
|
||||
}
|
Loading…
Reference in New Issue