[PATCH] D107292: [clang] adds warning to alert user when they use alternative tokens as references

Arthur O'Dwyer via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 2 14:29:55 PDT 2021


Quuxplusone added a comment.

@dblaikie wrote:

> Not a huge objection - but minor quandry: What's the motivation for this patch?

AIUI, this diagnostic is a PR stunt, similar to Clang's existing `-Wunicode-homoglyph`:

  test.cpp:3:13: warning: treating Unicode character <U+037E> as identifier character rather than as ';' symbol [-Wunicode-homoglyph]
      return 0Íž
              ^

It's not that anyone would ever //intentionally// write code like `void print(const std::string bitand s)`; it's that if someone copy-pastes such code from Reddit into Clang, Clang will helpfully explain the trick to them. I'm ambivalent as to whether this is worth it; but the patch is certainly tiny enough that it's not obviously //not// worth it...



================
Comment at: clang/include/clang/Basic/DiagnosticParseKinds.td:1552
+  "use '%select{&|&&}0' when declaring %select{lvalue|rvalue and forwarding}1 references">,
+  InGroup<DiagGroup<"declare-references-with-symbols">>, DefaultWarn;
+
----------------
aaron.ballman wrote:
> Pretty sure you don't need `DefaultWarn` here (I think you'd use that for warnings that are off by default, like ones spelled with `Extension` instead of `Warning` or `ExtWarn`).
I suggest:
`"use '%select{&|&&}0' when declaring an %select{lvalue|rvalue or forwarding}0 reference"`
Besides the minor grammar tweak, this should avoid the need to pass the same argument twice (as both argument 0 and argument 1). It's possible that this ends up not working for some technical reason, but I'd be surprised if it didn't Just Work.



================
Comment at: clang/lib/Parse/ParseDecl.cpp:5847-5849
+        constexpr int AmpAmp = 1;
+        Diag(Loc, diag::warn_declare_references_with_symbols)
+            << AmpAmp << AmpAmp;
----------------
aaron.ballman wrote:
> cjdb wrote:
> > aaron.ballman wrote:
> > > For consistency with the `Lvalue` case above.
> > I originally had `Rvalue`, but this is //technically// diagnosing both rvalue refs and forwarding refs (hence the awkward name). I guess it doesn't really matter at the parsing stage though, so this is just commentary.
> Oh, good point on forwarding refs. Maybe change the previous one to `Amp` in that case?
In both cases, I'd write
```
Diag(Loc, diag::warn_declare_references_with_symbols)
            << (Kind == tok::ampamp);
```
or
```
    << static_cast<int>(Kind == tok::ampamp);
```
only if absolutely necessary (e.g. because the former doesn't build, or if it runtime-errors).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D107292/new/

https://reviews.llvm.org/D107292



More information about the cfe-commits mailing list