[PATCH] D154290: [Clang] Implement P2741R3 - user-generated static_assert messages
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 19 09:25:42 PDT 2023
aaron.ballman added a comment.
This is looking pretty close to good, but there were some outstanding questions still.
================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:86
"%select{case value|enumerator value|non-type template argument|"
- "array size|explicit specifier argument|noexcept specifier argument}0 "
+ "array size|explicit specifier argument|noexcept specifier argument|call to size()|call to data()}0 "
"is not a constant expression">;
----------------
aaron.ballman wrote:
> This should also be re-flowed to 80 columns.
It looks like these edits were missed.
================
Comment at: clang/lib/AST/DeclPrinter.cpp:952-953
&Context);
- if (StringLiteral *SL = D->getMessage()) {
+ if (StringLiteral *SL =
+ llvm::dyn_cast_if_present<StringLiteral>(D->getMessage())) {
Out << ", ";
----------------
Should there be an `else` clause here that does `D->getMessage()->prettyPrint()` so that we print out *something*? Otherwise, there should be a fixme comment about not printing out non-string literal operands.
================
Comment at: clang/lib/AST/ExprConstant.cpp:16408
+ Char) ||
+ !Char.isInt())
+ return false;
----------------
shafik wrote:
> Why are we specifically checking `!isInt()` what `Kind` do we expect?
I think the caller already validates that we have a pointer to the correct kind of string, so I kind of think the `isInt()` check is unnecessary. If it's not, can you show a test case where it kicks in?
================
Comment at: clang/test/SemaCXX/static-assert-cxx26.cpp:269
+ //expected-error {{static assertion failed}} \
+ // expected-note {{in call to 'InvalidPtr{}.data()'}}
----------------
One more test case to consider: do we properly handle dependent expressions in the assert itself? e.g.,
```
template <typename Ty>
struct S {
static_assert(false, Ty{});
};
struct Frobble {
constexpr int size() const { return 5; }
consterxpr const char *data() const { return "hello"; }
};
S<Frobble> s; // Good, fails with "hello"
S<int> t; // Incorrect
```
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D154290/new/
https://reviews.llvm.org/D154290
More information about the cfe-commits
mailing list