zequanwu marked an inline comment as done.
zequanwu added inline comments.

================
Comment at: clang/lib/Sema/AnalysisBasedWarnings.cpp:1518
   UsesMap uses;
+  UsesMap constRefUses;
 
----------------
rsmith wrote:
> zequanwu wrote:
> > rnk wrote:
> > > If possible, it would be nice to avoid having a second map.
> > I use second map to let the new warning be orthogonal to existing warnings. 
> > That means when we have both `-Wuninitialized` and 
> > `-Wno-uninitialized-const-reference`, the old test cases about 
> > uninitialized variables should all passed. Otherwise, I need to somehow 
> > detect the presence of `-Wno-uninitialized-const-reference`, which I don't 
> > see a way to do that. Consider this code if we have only one map:
> > ```
> > void consume_const_ref(const int &n);
> > int test_const_ref() {
> >   int n;
> >   consume_const_ref(n);
> >   return n;
> > }
> > ```
> > No matter if the flag`-Wno-uninitialized-const-reference` is present or 
> > not, we still need to add `n` in `consume_const_ref(n);` to `uses` map and 
> > then let `S.Diag` to decide to diagnose it or not depend on the presence of 
> > `-Wno-uninitialized-const-reference`. If the flag is given, `S.Diag` will 
> > just ignore the warning, but uninit var warning will diagnose if 
> > `Use.getKind()` returns `Always` in 
> > https://github.com/llvm/llvm-project/blob/master/clang/lib/Sema/AnalysisBasedWarnings.cpp#L814
> >  . That is not desired. Since the original behavior is to ignore the `n` in 
> > `consume_const_ref(n);` by not adding it to the `uses` map.
> > 
> > If there is a way to detect the presence of 
> > `-Wno-uninitialized-const-reference` or to know if 
> > `Sema::Diag(SourceLocation Loc, unsigned DiagID)` actually diagnosed a 
> > warning, the use of second map can be avoid. 
> Interesting testcase :)
> 
> Ideally we want the set of diagnostics from a particular compilation to be 
> the same you'd get by building with `-Weverything` and then filtering out the 
> ones you didn't want. So it's better to not ask whether 
> `-Wuninitialized-const-reference` is enabled or not.
> 
> I think we only populate this map after we've found an uninitialized use; if 
> so, the cost of a second map seems likely to be acceptable.
> 
> FYI, there is a mechanism to ask the "is this diagnostic enabled?" question, 
> but generally we'd prefer if it's only used to avoid doing work that would be 
> redundant if the warning is disabled. You can use 
> `Diag.isIgnored(diag::warn_..., Loc)` to determine if a diagnostic with the 
> given ID would be suppressed at the given location. (In fact, it looks like 
> this is already being called in a later change in this file.)
I think second map is necessary. So, `Diag.isIgnored` is not abused.


================
Comment at: clang/lib/Sema/AnalysisBasedWarnings.cpp:1590-1600
+    // flush all const reference uses diags
+    for (const auto &P : constRefUses) {
+      const VarDecl *vd = P.first;
+      const MappedType &V = P.second;
+
+      UsesVec *vec = V.getPointer();
+      for (const auto &U : *vec) {
----------------
rsmith wrote:
> Do we want any idiomatic-self-init special-case handling here? For example:
> 
> ```
> void f(const int&);
> void g() {
>   int a = a;
>   f(a);
> }
> ```
> 
> Following the logic above, should that warn on the `int a = a;` not on the 
> `f(a)` call? Or should we warn only on the `f(a)` call itself in this case? 
> It seems like it might be surprising to say that `a` is "uninitialized" here, 
> since an initializer was provided, even though it was a garbage one.
For this case, I think we should warn at `int a = a`, like the comment in 
`DiagnoseUninitializedUse` said, 
https://github.com/llvm/llvm-project/blob/master/clang/lib/Sema/AnalysisBasedWarnings.cpp#L986-L996

`f(a)` is considered as accessing `a`.


================
Comment at: clang/test/SemaCXX/warn-uninitialized-const-reference.cpp:23
+    int k = const_use(k); // expected-warning {{variable 'k' is uninitialized 
when used within its own initialization}}
+    A a2 = const_use_A(a2); // expected-warning {{variable 'a2' is 
uninitialized when used within its own initialization}}
+    A a3(const_ref_use_A(a3)); // expected-warning {{variable 'a3' is 
uninitialized when passes as a const reference parameter here}}
----------------
aeubanks wrote:
> For my knowledge, is this to make sure that this other warning takes 
> precedence over the one introduced in this change? If it is, a comment would 
> be nice.
No, original behavior of `-Wuninitialized` for line 24 is silence. Now the new 
warning will be emitted because it is const use of uninitialized variable.


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

https://reviews.llvm.org/D79895



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to