[PATCH] D111400: [Clang] Implement P2242R3
Corentin Jabot via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 15 14:12:00 PST 2022
cor3ntin added a comment.
In D111400#3243826 <https://reviews.llvm.org/D111400#3243826>, @aaron.ballman wrote:
> In D111400#3172097 <https://reviews.llvm.org/D111400#3172097>, @cor3ntin wrote:
>
>> Regression compared to the status quo:
>> This code no longer warns (as noted by Hubert above)
>>
>> auto f = [](bool b) {
>> if (b) return 42;
>> static int x = 0;
>> return x;
>> };
>> constexpr int x = f(true);
>> const int *p = &x;
>>
>> GCC doesn't warn and... if we wanted to produce a warning there, I have no idea how to go about it.
>
> I think I found the issue in the code, but one thing that's strange is that we don't seem to treat it as an extension but instead issue an error, but the behavior is consistent with other things we handle as an extension there (e.g., a local variable in C++14 mode).
Yes, that was a bug, but the code above cannot be diagnose.
at the time when the lambda f() is parsed, there is no indication that it must be usable in a constexpr context, and so the compiler doesn't emit a diagnostic.
It does when the call operator is marked explicitly `constexpr`
auto f = [] (bool b) constexpr {
if (b) return 42;
static int x = 0;
return x;
};
constexpr int x = f(true);
const int *p = &x;
This behavior is identical to GCC's https://compiler-explorer.com/z/xor3oYGMa
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111400/new/
https://reviews.llvm.org/D111400
More information about the cfe-commits
mailing list