aaron.ballman added inline comments.
================ Comment at: clang/lib/CodeGen/CodeGenAction.cpp:783 + : diag::warn_fe_backend_warning_attr) + << FD->getDeclName() << EA->getUserDiagnostic(); + } ---------------- The diagnostics engine knows how to properly format a `NamedDecl *` directly (and this will take care of properly quoting the name in the diagnostics as well). ================ Comment at: clang/lib/Sema/SemaDeclAttr.cpp:964-965 + bool match = + (EA->isError() && NewAttrSpellingIndex < ErrorAttr::GNU_warning) || + (EA->isWarning() && NewAttrSpellingIndex >= ErrorAttr::GNU_warning); + if (!match) { ---------------- nickdesaulniers wrote: > aaron.ballman wrote: > > nickdesaulniers wrote: > > > aaron.ballman wrote: > > > > It's a bit tricky for me to tell from the patch -- are the enumerators > > > > in the correct order that this logic still works for when the [[]] > > > > spelling is used? > > > For reference, the generated `enum Spelling` looks like: > > > ``` > > > 3611 public: > > > > > > > > > 3612 enum Spelling { > > > > > > > > > 3613 GNU_error = 0, > > > > > > > > > 3614 CXX11_gnu_error = 1, > > > > > > > > > 3615 C2x_gnu_error = 2, > > > > > > > > > 3616 GNU_warning = 3, > > > > > > > > > 3617 CXX11_gnu_warning = 4, > > > > > > > > > 3618 C2x_gnu_warning = 5, > > > > > > > > > 3619 SpellingNotCalculated = 15 > > > > > > > > > 3620 > > > > > > > > > 3621 }; > > > ``` > > > while using `getAttributeSpellingListIndex` rather than > > > `getNormalizedFullName` allows us to avoid a pair of string comparisons > > > in favor of a pair of `unsigned` comparisons, we now have an issue > > > because there are technically six spellings. (I guess it's not clear to > > > me what's `CXX11_gnu_*` vs `C2x_gnu_*`?) We could be explicit against > > > checking all six rather than two comparisons. > > > > > > Or I can use local variables with more helpful identifiers like: > > > > > > ``` > > > bool NewAttrIsError = NewAttrSpellingIndex < ErrorAttr::GNU_warning; > > > bool NewAttrIsWarning = NewAttrSpellingIndex >= ErrorAttr::GNU_warning; > > > bool Match = (EA->isError() && NewAttrIsError) || (EA->isWarning() && > > > NewAttrIsWarning); > > > ``` > > > > > > WDYT? > > > (I guess it's not clear to me what's CXX11_gnu_* vs C2x_gnu_*?) > > > > A bit of a historical thing. C2x `[[]]` and C++11 `[[]]` are modeled as > > different spellings. This allows us to specify attributes with a `[[]]` > > spelling in only one of the languages without having to do an awkward dance > > involving language options. e.g., it makes it easier to support an > > attribute spelled `__attribute__((foo))` and `[[vendor::foo]]` in C2x and > > spelled `[[foo]]` in C++. it picks up the `gnu` bit in the spelling by > > virtue of being an attribute with a `GCC` spelling -- IIRC, we needed to > > distinguish between GCC and Clang there for some reason I no longer recall. > > > > > WDYT? > > > > I think the current approach is reasonable, but I think the previous > > approach (doing the string compare) was more readable. If you have a > > preference for using the string compare approach as it originally was, I'd > > be fine with that now that I see how my suggestion is playing out in > > practice. If you'd prefer to keep the current approach, I'd also be fine > > with that. Thank you for trying this out, sorry for the hassle! > > now that I see how my suggestion is playing out in practice > > Thank you for trying this out, sorry for the hassle! > > Ah, that's ok. [[ https://www.youtube.com/watch?v=aPVLyB0Yc6I | Sometimes > you eat the bar, sometimes the bar eats you. ]] I've done that myself > already in this patch when playing with llvm::Optional (and C++ default > parameters). > > Changed back to string comparison now. I don't expect any of this code to be > hot, ever. Marking as done. Thanks! ================ Comment at: clang/test/CodeGen/attr-error.c:9 +// CHECK: call void @foo(), !srcloc [[SRCLOC:![0-9]+]] +// CHECK: declare void @foo() [[ATTR:#[0-9]+]] +// CHECK: attributes [[ATTR]] = {{{.*}}"dontcall" ---------------- This is failing the CI pipeline on Windows because the declaration there looks like: `declare dso_local void @foo() #1` ================ Comment at: clang/test/CodeGen/attr-warning.c:9 +// CHECK: call void @foo(), !srcloc [[SRCLOC:![0-9]+]] +// CHECK: declare void @foo() [[ATTR:#[0-9]+]] +// CHECK: attributes [[ATTR]] = {{{.*}}"dontcall" ---------------- Similar issue here as above. ================ Comment at: clang/test/Frontend/backend-attribute-error-warning-optimize.c:1 +// REQUIRES: x86-registered-target +// RUN: %clang_cc1 -O2 -verify -emit-codegen-only %s ---------------- nickdesaulniers wrote: > aaron.ballman wrote: > > Out of curiosity, why is this required? I would have assumed this would be > > backend-independent functionality? > > > > Also, I have no idea where these tests should live. They're not really > > frontend tests, it's more about the integration between the frontend and > > the backend. We do have `clang/test/Integration` but there's not a lot of > > content there to be able to say "oh yeah, this is testing the same sort of > > stuff". No idea if other reviewers have opinions on this. > Since I got the idea for this feature from -Wframe-larger-than=, I followed > clang/test/Frontend/backend-diagnostic.c, both for the REQUIRES line and the > test location. > > I guess clang/test/Frontend/backend-diagnostic.c uses x86 inline asm, so > maybe I can remove the REQUIRES line. But if my new tests move then so > should clang/test/Frontend/backend-diagnostic.c (maybe pre-commit). Will > leave that for other reviewers, but removing REQUIRES lines. Given that there's not an obviously correct answer, I'm fine leaving the tests here. We can rearrange the deck chairs a different day if we'd like. ================ Comment at: clang/test/Sema/attr-error.c:26 + +__attribute__((error("foo"), warning("foo"))) // expected-error {{'warning' and 'error' attributes are not compatible}} +int ---------------- Can you also add a test for: ``` __attribute__((error("foo"))) int bad5(void); // expected-note {{conflicting attribute is here}} __attribute__((warning("foo"))) int bad5(void); // expected-error {{'warning' and 'error' attributes are not compatible}} ``` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106030/new/ https://reviews.llvm.org/D106030 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits