[PATCH] D111400: [Clang][C++2b] P2242R3: Non-literal variables [...] in constexpr
Hubert Tong via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 20 17:08:33 PDT 2022
hubert.reinterpretcast added inline comments.
================
Comment at: clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:26
};
- struct Nonlit { Nonlit(); }; // expected-note {{not literal}}
+ struct Nonlit { // cxx2a-note {{'Nonlit' is not literal becaus}}
+ Nonlit();
----------------
Typo still present.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:1-2
+// RUN: %clang_cc1 -std=c++2b -fsyntax-only -verify=expected,cxx2a %s -fcxx-exceptions -triple=x86_64-linux-gnu -Wpre-c++2b-compat
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify=expected,cxx2b %s -fcxx-exceptions -triple=x86_64-linux-gnu
+
----------------
Flip `cxx2a` and `cxx2b` prefixes to match mode used. Add `-Wno-c++2b-extensions` since tests for those warnings are covered in `p3-2b.cpp`.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:8
+
+#if __cplusplus > 202002
+
----------------
It's customary to have the `L` suffix in the context of checking `__cplusplus`.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:90
+
+int non_literal_1 = non_literal(false);
+
----------------
Evaluate as `constexpr`.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:116
+
+int d = label();
+
----------------
Evaluate as `constexpr`.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:118
+
+} // namespace eval_goto
+
----------------
Move `#endif` to here (from below) so the explicitly-`constexpr` lambda cases are also tried in C++20 mode.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:120-121
+
+// Test that explicitely constexpr lambdas behave correctly,
+// This is to be constracted with the test for implicitely constexpr lambda below.
+int test_in_lambdas() {
----------------
Fix typos.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:125
+ static const int m = 32; // expected-note {{control flows through the declaration of a static variable}} \
+ // expected-warning {{incompatible with C++ standards before C++2b}}
+ return m;
----------------
Adjust for suggested changes: do not expect C++2b mode warning in C++20 mode.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:132
+ return 0;
+ static const int m = n; // expected-warning {{incompatible with C++ standards before C++2b}}
+ return m;
----------------
Adjust for suggested changes: do not expect C++2b mode warning in C++20 mode.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:141
+ else
+ goto test; // expected-warning {{incompatible with C++ standards before C++2b}} \
+ // expected-note {{subexpression not valid in a constant expression}}
----------------
Adjust for suggested changes: do not expect C++2b mode warning in C++20 mode.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:147-148
+ c(0);
+ constexpr auto c_error = c(1); // expected-error {{constexpr variable 'c_error' must be initialized by a constant expression}} \
+ // expected-note {{in call to}}
+
----------------
Minor: Adjust alignment of comments.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:152
+ if (!b)
+ NonLiteral n; // expected-note {{non-literal type 'NonLiteral' cannot be used in a constant expression}}
+ return 0;
----------------
Adjust for C++20/C++2b differences.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:156-158
+ constexpr auto non_literal_ok = non_literal(false); // expected-error {{constexpr variable 'non_literal_ok' must be initialized by a constant expression}} \
+ // expected-note {{in call}}
+ constexpr auto non_literal_ko = non_literal(true);
----------------
Guard calls to be C++2b only (since definition is not okay in C++20 mode). Adjust naming so that "ok" name is used for the C++2b-valid case.
================
Comment at: clang/test/SemaCXX/constant-expression-cxx2b.cpp:160-161
+}
+
+#endif
+
----------------
Move `#endif` up so the explicitly-`constexpr` lambda cases are also tried in C++20 mode.
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