[PATCH] D125011: [MSVC] Add support for pragma alloc_text
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 11 04:34:31 PDT 2022
aaron.ballman added inline comments.
================
Comment at: clang/include/clang/Basic/DiagnosticParseKinds.td:1136-1137
"expected non-wide string literal in '#pragma %0'">, InGroup<IgnoredPragmas>;
+def warn_pragma_expected_ascii_string : Warning<
+ "expected ascii string literal in '#pragma %0'">, InGroup<IgnoredPragmas>;
// - Generic errors
----------------
We use `warn_pragma_expected_non_wide_string` for all the other MS pragmas, so I think we should use that one here. Then, if we really care to, we can make `warn_pragma_expected_non_wide_string` more generally about non-ASCII string literals in a follow up.
================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:991-994
+def err_pragma_expected_file_scope : Error<
+ "'#pragma %0' can only appear at file scope">;
+
+def err_pragma_alloc_text_c_linkage: Error<
----------------
================
Comment at: clang/lib/Parse/ParsePragma.cpp:1206
+
+ ExpectAndConsume(tok::r_paren, diag::warn_pragma_expected_rparen, PragmaName);
+ if (ExpectAndConsume(tok::eof, diag::warn_pragma_extra_tokens_at_eol,
----------------
Should we be returning `false` if this comes back `true`? I'm worried about the case where there's a missing right paren, we warn about the pragma being ignored, find the EOL token and then actually handle the pragma.
================
Comment at: clang/lib/Parse/ParsePragma.cpp:1176-1179
+ if (SegmentName->getCharByteWidth() != 1) {
+ PP.Diag(PragmaLocation, diag::warn_pragma_expected_non_wide_string)
+ << PragmaName;
+ return false;
----------------
aaron.ballman wrote:
> I think we want to test `isAscii()` instead of looking at the byte width; we don't want to accept `u8"whatever"` any more than we want to accept `L"whatever"`.
>
> (The diagnostic text is also pretty bad because it'll diagnose non-wide literals as being wide, but that's an existing deficiency with the diagnostic and can be addressed separately.)
Ugh, I'm sorry, but I steered you wrong with this comment. I didn't notice until now that all the other MS pragmas use `getCharByteWidth() != 1` rather than `isAscii()`. I think we should replicate that mistake here, and then in a follow-up we can fix all the MS pragmas at once so that they consistently handle that case. WDYT?
================
Comment at: clang/lib/Sema/SemaAttr.cpp:748
+ &Functions) {
+ if (!CurContext->getRedeclContext()->isFileContext()) {
+ Diag(PragmaLocation, diag::err_pragma_expected_file_scope) << "alloc_text";
----------------
Same question here about whether we need to get the redecl context or not.
================
Comment at: clang/test/Sema/pragma-ms-alloc-text.cpp:5
+#pragma alloc_text(a // expected-warning {{expected ',' in '#pragma alloc_text'}}
+#pragma alloc_text(a, a // expected-warning {{missing ')' after '#pragma alloc_text'}} expected-error {{use of undeclared a}}
+#pragma alloc_text(L"a", a) // expected-warning {{expected a string literal for the section name}}
----------------
This shows we have the parsing logic wrong -- we shouldn't get the use of undeclared identifier a because we shouldn't have gotten into Sema for this one.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D125011/new/
https://reviews.llvm.org/D125011
More information about the cfe-commits
mailing list