[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-21 Thread via cfe-commits

https://github.com/Sirraide closed 
https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-21 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/5] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/5] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/5] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

>From fa897f136484fedb96a2eb38e344611a363d415d Mon Sep 17 00:00:00

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread via cfe-commits

https://github.com/Sirraide approved this pull request.


https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk edited 
https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits


@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+(void)[&](this auto &self, int a) { };

a-tarasyuk wrote:

Outh, I've reverted the original changes, which handled that case too. Thanks

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/5] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/5] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/5] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

>From fa897f136484fedb96a2eb38e344611a363d415d Mon Sep 17 00:00:00

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread via cfe-commits


@@ -8264,11 +8264,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getType().isNull() && MD->isExplicitObjectMemberFunction())

Sirraide wrote:

```suggestion
  if (!MD->getType().isNull() && MD->isExplicitObjectMemberFunction() && 
  !MD->getParent()->isLambda())
```

Something like this maybe

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk deleted 
https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread via cfe-commits


@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+(void)[&](this auto &self, int a) { };

Sirraide wrote:

Ok, the test is correct now, but here we have a problem: The `a` parameter 
shadows the struct member, but it isn’t diagnosed—to be fair, we don’t 
currently diagnose that either, but it would be nice to do so. 

I think we do have to check if the `CXXMethodDecl` is a lambda call operator.

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread via cfe-commits


@@ -8264,11 +8264,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getType().isNull() && MD->isExplicitObjectMemberFunction())

Sirraide wrote:

Alternatively, we also have `isLambdaCallWithExplicitObjectParameter()`, which 
is a free function in the `clang` namespace that we could maybe use here.

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread via cfe-commits

https://github.com/Sirraide edited 
https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/4] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/4] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/4] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

>From fa897f136484fedb96a2eb38e344611a363d415d Mon Sep 17 00:00:00

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/4] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/4] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/4] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

>From fa897f136484fedb96a2eb38e344611a363d415d Mon Sep 17 00:00:00

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread via cfe-commits


@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+(void)[&](this auto &self, int x) { };

Sirraide wrote:

```suggestion
(void)[&](this auto &self, int a) { };
```
I think you missed this change that I pointed out earlier.

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/3] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/3] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/3] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

___
cfe-commits mailin

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-20 Thread Oleksandr T. via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

a-tarasyuk wrote:

@Sirraide it does exist., however, it doesn't handle the case described above

https://github.com/llvm/llvm-project/blob/08e7609692af3cb84da510deac70eeb02cbceb6d/clang/include/clang/AST/ASTLambda.h#L38-L41

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-19 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/3] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/3] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/3] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

___
cfe-commits mailin

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-19 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/3] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/3] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/3] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

___
cfe-commits mailin

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-13 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/3] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/3] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/3] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

___
cfe-commits mailin

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-06 Thread via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

Sirraide wrote:

We might want a similar function that does more or less the opposite in that 
case (i.e. an `isLambdaCallWithExplicitObjectParameter`)?

CC @cor3ntin

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-06 Thread Oleksandr T. via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

a-tarasyuk wrote:

The weird thing is that this is a valid decoration - 
https://compiler-explorer.com/z/fKoozKb3f

For instance currently to check lambda implicit object parameter, used opposite 
to explicit object member function with NULL validation

https://github.com/llvm/llvm-project/blob/f87484d5910c1c708bfd93ef588d6ff8307e2477/clang/include/clang/AST/ASTLambda.h#L43-L51



https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-06 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/3] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/3] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

>From 2a2cb900b090d4bb2f1e66c3e027cd947d8053c4 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Wed, 6 Nov 2024 12:18:00 +0200
Subject: [PATCH 3/3] remove unnesessary warning

---
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 19db49a4566fa7..e6615e969910e2 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -7,7 +7,7 @@ struct Foo {
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
   void f3() {
-[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+(void)[&](this auto &self, int x) { };
   }
 };
 } // namespace GH95707

___
cfe-commits mailin

[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-06 Thread via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

Sirraide wrote:

It makes sense that that would fail, but I’m still a bit confused as to how we 
end up w/ a `CXXMethodDecl` whose type (after desugaring) isn’t a 
`FunctionProtoType`. If that *does* happen somehow, I should hope that 
`isInvalidDecl()` also returns `true`, in which case you’d check for that first.

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-05 Thread via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

Sirraide wrote:

> Thanks for bringing that to my attention. In such cases
> 
> ```c++
> struct C {
>   int b = 5;
>   int foo() {
> return [a = b]() {
>   return [=, b = a]() {
> return b;
>   }();
> }();
>   }
> };
> ```
> 
> depending exclusively on `isExplicitObjectMemberFunction` isn’t safe, as it 
> could lead to assertion failures during type resolution

Er, can you elaborate what the problem here is maybe?

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-05 Thread via cfe-commits


@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}

Sirraide wrote:

```suggestion
(void) [&](this auto &self, int a) { };
```
Typo, and add `(void)` so we don’t get a warning we don’t care about in this 
case ;þ

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-05 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk deleted 
https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-05 Thread Oleksandr T. via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

a-tarasyuk wrote:

@Sirraide Thanks for the feedback. I've added an additional test. 

> Maybe this also warrants a comment, because at first it wasn’t immediately 
> obvious to me why we’d want to ignore lambda call operators here.

Thanks for bringing that to my attention. In such cases

```cpp
struct C {
  int b = 5;
  int foo() {
return [a = b]() {
  return [=, b = a]() {
return b;
  }();
}();
  }
};
```

depending exclusively on `isExplicitObjectMemberFunction` isn’t safe, as it 
could lead to assertion failures during type resolution

https://github.com/llvm/llvm-project/blob/1a590870b6b3452934ecc245e01957fdab48909c/clang/lib/AST/Decl.cpp#L3699-L3702

There’s an option to restrict the null type or to validate the parent scope. 
I've been trying to find a suitable utility to do this, but I haven’t had any 
luck. If there’s one available, I’d appreciate it if you could point me to it. 
thanks










https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-05 Thread Oleksandr T. via cfe-commits


@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;

a-tarasyuk wrote:

```
```

https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-05 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk updated 
https://github.com/llvm/llvm-project/pull/114813

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH 1/2] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

>From 849515a74f1c82845b0baa100729aa80bf236f66 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Tue, 5 Nov 2024 15:33:14 +0200
Subject: [PATCH 2/2] update tests/release notes

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index af8288ee8a8296..5ecde32bb70429 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,7 +464,7 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
-- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+- Clang now omits shadowing warnings for parameter names in explicit object 
member functions (#GH95707).
 
 Improvements to Clang's time-trace
 --
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
index 0cf47f3848979c..19db49a4566fa7 100644
--- a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -6,5 +6,8 @@ struct Foo {
 
   void f1(this auto &self, int a) { self.a = a; }
   void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+  void f3() {
+[&](this auto &self, int x) { }; // expected-warning {{expression result 
unused}}
+  }
 };
 } // namespace GH95707

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


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-04 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Oleksandr T. (a-tarasyuk)


Changes

Fixes #95707

---
Full diff: https://github.com/llvm/llvm-project/pull/114813.diff


3 Files Affected:

- (modified) clang/docs/ReleaseNotes.rst (+2) 
- (modified) clang/lib/Sema/SemaDecl.cpp (+5-2) 
- (added) clang/test/SemaCXX/cxx2b-warn-shadow.cpp (+10) 


``diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

``




https://github.com/llvm/llvm-project/pull/114813
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] eliminate shadowing warnings for parameters using deducing this (PR #114813)

2024-11-04 Thread Oleksandr T. via cfe-commits

https://github.com/a-tarasyuk created 
https://github.com/llvm/llvm-project/pull/114813

Fixes #95707

>From 91ff2b4226110ea35c78f0f1b6ff89b4bec2c788 Mon Sep 17 00:00:00 2001
From: Oleksandr T 
Date: Mon, 4 Nov 2024 17:38:46 +0200
Subject: [PATCH] [Clang] eliminate shadowing warnings for parameters using
 deducing this

---
 clang/docs/ReleaseNotes.rst  |  2 ++
 clang/lib/Sema/SemaDecl.cpp  |  7 +--
 clang/test/SemaCXX/cxx2b-warn-shadow.cpp | 10 ++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx2b-warn-shadow.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1372e49dfac03c..af8288ee8a8296 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -464,6 +464,8 @@ Improvements to Clang's diagnostics
 
 - Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables 
(#GH90073).
 
+- Clang now omits shadowing warnings for parameter names using deducing this 
(#GH95707).
+
 Improvements to Clang's time-trace
 --
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1aa3e8edfe1b13..38b07b15eb3eb2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8236,11 +8236,14 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
   DeclContext *NewDC = D->getDeclContext();
 
   if (FieldDecl *FD = dyn_cast(ShadowedDecl)) {
-// Fields are not shadowed by variables in C++ static methods.
-if (CXXMethodDecl *MD = dyn_cast(NewDC))
+if (CXXMethodDecl *MD = dyn_cast(NewDC)) {
+  // Fields are not shadowed by variables in C++ static methods.
   if (MD->isStatic())
 return;
 
+  if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
+return;
+}
 // Fields shadowed by constructor parameters are a special case. Usually
 // the constructor initializes the field with the parameter.
 if (isa(NewDC))
diff --git a/clang/test/SemaCXX/cxx2b-warn-shadow.cpp 
b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
new file mode 100644
index 00..0cf47f3848979c
--- /dev/null
+++ b/clang/test/SemaCXX/cxx2b-warn-shadow.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++2b -Wshadow-all %s
+
+namespace GH95707 {
+struct Foo {
+  int a; // expected-note {{previous declaration is here}}
+
+  void f1(this auto &self, int a) { self.a = a; }
+  void f2(int a) { } // expected-warning {{declaration shadows a field of 
'GH95707::Foo'}}
+};
+} // namespace GH95707

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