[PATCH] D99456: [C++2b] Support size_t literals
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 29 07:53:55 PDT 2021
aaron.ballman requested changes to this revision.
aaron.ballman added a comment.
This revision now requires changes to proceed.
Thanks for working on this! I think the direction is good in general, but I think we should also add tests for use in the preprocessor (`#if 1z == 1`, etc) as well as tests for the behavior in C.
================
Comment at: clang/include/clang/Basic/DiagnosticCommonKinds.td:191
+def ext_cxx2b_size_t_suffix : Extension<
+ "size_t suffix for literals is a C++2b extension">,
+ InGroup<CXX2b>;
----------------
================
Comment at: clang/include/clang/Lex/LiteralSupport.h:66
bool isLongLong : 1;
+ bool isSizeT : 1; // C++2b's z/uz size_t literals
bool isHalf : 1; // 1.0h
----------------
================
Comment at: clang/lib/Frontend/InitPreprocessor.cpp:593-595
+ if (LangOpts.CPlusPlus2b) {
+ Builder.defineMacro("__cpp_size_t_suffix", "202011L");
+ }
----------------
================
Comment at: clang/lib/Lex/LiteralSupport.cpp:682
+ break; // invalid for floats.
+ if (isMicrosoftInteger)
+ break; // invalid for Microsoft integers.
----------------
================
Comment at: clang/lib/Lex/PPExpressions.cpp:325-327
+ if (!PP.getLangOpts().CPlusPlus2b && Literal.isSizeT) {
+ PP.Diag(PeekTok, diag::ext_cxx2b_size_t_suffix);
+ }
----------------
================
Comment at: clang/lib/Lex/PPExpressions.cpp:326
+ if (!PP.getLangOpts().CPlusPlus2b && Literal.isSizeT) {
+ PP.Diag(PeekTok, diag::ext_cxx2b_size_t_suffix);
+ }
----------------
This feature is specific to C++ and needs some sort of diagnostic in C. There is not currently a WG14 proposal for this literal suffix, so I think this should be an error in that case rather than a warning.
================
Comment at: clang/lib/Sema/SemaExpr.cpp:3871-3873
+ if (!getLangOpts().CPlusPlus2b && Literal.isSizeT) {
+ Diag(Tok.getLocation(), diag::ext_cxx2b_size_t_suffix);
+ }
----------------
================
Comment at: clang/lib/Sema/SemaExpr.cpp:3872
+ if (!getLangOpts().CPlusPlus2b && Literal.isSizeT) {
+ Diag(Tok.getLocation(), diag::ext_cxx2b_size_t_suffix);
+ }
----------------
Same diagnostic needs for C here as above.
================
Comment at: clang/lib/Sema/SemaExpr.cpp:3911
+ if (Literal.isSizeT) {
+ assert(Ty.isNull() && "size_t literals can't be Microsoft literals");
+ unsigned SizeTSize = Context.getTargetInfo().getTypeWidth(
----------------
The assert message doesn't seem to match the predicate -- why does a null qualtype imply it's a microsoft literal?
================
Comment at: clang/test/SemaCXX/size_t-literal.cpp:14-16
+#if __cplusplus >= 202101L
+// expected-no-diagnostics
+#endif
----------------
Rather than check `__cplusplus` like this, I think the RUN lines should specify a verify prefix. e.g., `-verify=cxx2b` and then use `cxx2b-no-diagnostics` and `-verify=cxx20` and then use `cxx20-warning {{}}`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99456/new/
https://reviews.llvm.org/D99456
More information about the cfe-commits
mailing list