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:
Shivanshu Goyal 2020-12-16 12:01:54 -08:00 committed by Richard Smith
parent 735ab86b81
commit e53b9f733a
2 changed files with 19 additions and 4 deletions

View File

@ -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();
}

View File

@ -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}}
}