[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

zyn0217 wrote:

CI failure was an unrelated format issue.

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

zyn0217 wrote:

(Waiting for the CI before landing it. As usual, thank you all for the review!)

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Haojian Wu via cfe-commits

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

Thanks for the investigation and fix!

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Vlad Serebrennikov via cfe-commits

https://github.com/Endilll commented:

`Sema.h` changes look good to me.

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Sam McCall via cfe-commits

https://github.com/sam-mccall approved this pull request.

Very nice, thanks!

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread via cfe-commits

llvmbot wrote:



@llvm/pr-subscribers-clang-tools-extra

@llvm/pr-subscribers-clangd

Author: Younan Zhang (zyn0217)


Changes

The `ConceptReference`'s `FoundDecl` claims it "can differ from `NamedConcept` 
when, for example, the concept was found through a `UsingShadowDecl`", but such 
the contract was not previously respected.

Fixes https://github.com/llvm/llvm-project/issues/82628

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


9 Files Affected:

- (modified) clang-tools-extra/clangd/unittests/SelectionTests.cpp (+28) 
- (modified) clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp (+1-3) 
- (modified) clang/docs/ReleaseNotes.rst (+1) 
- (modified) clang/include/clang/Sema/Sema.h (+1-1) 
- (modified) clang/lib/Sema/SemaDecl.cpp (+5-1) 
- (modified) clang/lib/Sema/SemaTemplate.cpp (+23-20) 
- (modified) clang/lib/Sema/SemaTemplateInstantiate.cpp (+2-1) 
- (modified) clang/lib/Sema/SemaType.cpp (+12-3) 
- (modified) clang/test/AST/ast-dump-concepts.cpp (+50) 


``diff
diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp 
b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 754e8c287c5148..db516a1f62a357 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -10,6 +10,7 @@
 #include "SourceCode.h"
 #include "TestTU.h"
 #include "support/TestTracer.h"
+#include "clang/AST/ASTConcept.h"
 #include "clang/AST/Decl.h"
 #include "llvm/Support/Casting.h"
 #include "gmock/gmock.h"
@@ -893,6 +894,33 @@ TEST(SelectionTest, DeclContextLambda) {
   EXPECT_TRUE(ST.commonAncestor()->getDeclContext().isFunctionOrMethod());
 }
 
+TEST(SelectionTest, UsingConcepts) {
+  llvm::Annotations Test(R"cpp(
+namespace ns {
+template 
+concept Foo = true;
+}
+
+using ns::Foo;
+
+template 
+auto Func(Fo^o auto V) -> Fo^o decltype(auto) {
+  Fo^o auto W = V;
+  return W;
+}
+)cpp");
+  auto TU = TestTU::withCode(Test.code());
+  TU.ExtraArgs.emplace_back("-std=c++2c");
+  auto AST = TU.build();
+  for (auto Point : Test.points()) {
+auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
+ Point, Point);
+auto *C = ST.commonAncestor()->ASTNode.get();
+EXPECT_TRUE(C && C->getFoundDecl() &&
+C->getFoundDecl()->getKind() == Decl::UsingShadow);
+  }
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
diff --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
index 5dc88157e13af0..dac3f39e1a6584 100644
--- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -548,9 +548,7 @@ TEST(WalkAST, Concepts) {
   testWalk(Concept, "template requires ^Foo void func() {}");
   testWalk(Concept, "template void func() requires ^Foo {}");
   testWalk(Concept, "void func(^Foo auto x) {}");
-  // FIXME: Foo should be explicitly referenced.
-  testWalk("template concept Foo = true;",
-   "void func() { ^Foo auto x = 1; }");
+  testWalk(Concept, "void func() { ^Foo auto x = 1; }");
 }
 
 TEST(WalkAST, FriendDecl) {
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 690fc7ed271a3d..faee6e048229c2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -347,6 +347,7 @@ Bug Fixes to C++ Support
 
 Bug Fixes to AST Handling
 ^
+- Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. 
(#GH82628)
 
 Miscellaneous Bug Fixes
 ^^^
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index cfc1c3b3494788..6826e917b7e38b 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9206,7 +9206,7 @@ class Sema final {
 
   bool AttachTypeConstraint(NestedNameSpecifierLoc NS,
 DeclarationNameInfo NameInfo,
-ConceptDecl *NamedConcept,
+ConceptDecl *NamedConcept, NamedDecl *FoundDecl,
 const TemplateArgumentListInfo *TemplateArgs,
 TemplateTypeParmDecl *ConstrainedParameter,
 SourceLocation EllipsisLoc);
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1f4a041e88dfff..5850cd0ab6b9aa 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1192,9 +1192,13 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, 
CXXScopeSpec ,
 return ParsedType::make(T);
   }
 
-  if (isa(FirstDecl))
+  if (isa(FirstDecl)) {
+// We want to preserve the UsingShadowDecl for concepts.
+if (auto *USD = dyn_cast(Result.getRepresentativeDecl()))
+  return NameClassification::Concept(TemplateName(USD));
 return NameClassification::Concept(
 TemplateName(cast(FirstDecl)));
+  }
 
   if (auto 

[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 updated 
https://github.com/llvm/llvm-project/pull/85032

>From 6469dca42dae503bf08a65e55d60ccf48e012f25 Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Wed, 13 Mar 2024 13:47:33 +0800
Subject: [PATCH 1/4] [concepts] Preserve the FoundDecl of ConceptReference
 properly

---
 .../clangd/unittests/SelectionTests.cpp   | 28 +++
 clang/docs/ReleaseNotes.rst   |  1 +
 clang/include/clang/Sema/Sema.h   |  1 +
 clang/lib/Sema/SemaDecl.cpp   |  6 ++-
 clang/lib/Sema/SemaTemplate.cpp   | 42 +---
 clang/lib/Sema/SemaTemplateInstantiate.cpp|  3 +-
 clang/lib/Sema/SemaType.cpp   |  8 ++-
 clang/test/AST/ast-dump-concepts.cpp  | 50 +++
 8 files changed, 116 insertions(+), 23 deletions(-)

diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp 
b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 754e8c287c5148..db516a1f62a357 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -10,6 +10,7 @@
 #include "SourceCode.h"
 #include "TestTU.h"
 #include "support/TestTracer.h"
+#include "clang/AST/ASTConcept.h"
 #include "clang/AST/Decl.h"
 #include "llvm/Support/Casting.h"
 #include "gmock/gmock.h"
@@ -893,6 +894,33 @@ TEST(SelectionTest, DeclContextLambda) {
   EXPECT_TRUE(ST.commonAncestor()->getDeclContext().isFunctionOrMethod());
 }
 
+TEST(SelectionTest, UsingConcepts) {
+  llvm::Annotations Test(R"cpp(
+namespace ns {
+template 
+concept Foo = true;
+}
+
+using ns::Foo;
+
+template 
+auto Func(Fo^o auto V) -> Fo^o decltype(auto) {
+  Fo^o auto W = V;
+  return W;
+}
+)cpp");
+  auto TU = TestTU::withCode(Test.code());
+  TU.ExtraArgs.emplace_back("-std=c++2c");
+  auto AST = TU.build();
+  for (auto Point : Test.points()) {
+auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
+ Point, Point);
+auto *C = ST.commonAncestor()->ASTNode.get();
+EXPECT_TRUE(C && C->getFoundDecl() &&
+C->getFoundDecl()->getKind() == Decl::UsingShadow);
+  }
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 690fc7ed271a3d..faee6e048229c2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -347,6 +347,7 @@ Bug Fixes to C++ Support
 
 Bug Fixes to AST Handling
 ^
+- Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. 
(#GH82628)
 
 Miscellaneous Bug Fixes
 ^^^
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index cfc1c3b3494788..00506d6ef227db 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9207,6 +9207,7 @@ class Sema final {
   bool AttachTypeConstraint(NestedNameSpecifierLoc NS,
 DeclarationNameInfo NameInfo,
 ConceptDecl *NamedConcept,
+NamedDecl *FoundDecl,
 const TemplateArgumentListInfo *TemplateArgs,
 TemplateTypeParmDecl *ConstrainedParameter,
 SourceLocation EllipsisLoc);
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1f4a041e88dfff..5850cd0ab6b9aa 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1192,9 +1192,13 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, 
CXXScopeSpec ,
 return ParsedType::make(T);
   }
 
-  if (isa(FirstDecl))
+  if (isa(FirstDecl)) {
+// We want to preserve the UsingShadowDecl for concepts.
+if (auto *USD = dyn_cast(Result.getRepresentativeDecl()))
+  return NameClassification::Concept(TemplateName(USD));
 return NameClassification::Concept(
 TemplateName(cast(FirstDecl)));
+  }
 
   if (auto *EmptyD = dyn_cast(FirstDecl)) {
 (void)DiagnoseUseOfDecl(EmptyD, NameLoc);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d62095558d0ffb..ad7055226f2631 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -1156,6 +1156,7 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec ,
 
   TemplateName TN = TypeConstr->Template.get();
   ConceptDecl *CD = cast(TN.getAsTemplateDecl());
+  UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
 
   DeclarationNameInfo ConceptName(DeclarationName(TypeConstr->Name),
   TypeConstr->TemplateNameLoc);
@@ -1174,15 +1175,15 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec ,
   }
   return AttachTypeConstraint(
   SS.isSet() ? SS.getWithLocInContext(Context) : NestedNameSpecifierLoc(),
-  ConceptName, CD,
+  ConceptName, CD, /*FoundDecl=*/USD,
   TypeConstr->LAngleLoc.isValid() ?  : nullptr,
   ConstrainedParameter, 

[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 updated 
https://github.com/llvm/llvm-project/pull/85032

>From 6469dca42dae503bf08a65e55d60ccf48e012f25 Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Wed, 13 Mar 2024 13:47:33 +0800
Subject: [PATCH 1/2] [concepts] Preserve the FoundDecl of ConceptReference
 properly

---
 .../clangd/unittests/SelectionTests.cpp   | 28 +++
 clang/docs/ReleaseNotes.rst   |  1 +
 clang/include/clang/Sema/Sema.h   |  1 +
 clang/lib/Sema/SemaDecl.cpp   |  6 ++-
 clang/lib/Sema/SemaTemplate.cpp   | 42 +---
 clang/lib/Sema/SemaTemplateInstantiate.cpp|  3 +-
 clang/lib/Sema/SemaType.cpp   |  8 ++-
 clang/test/AST/ast-dump-concepts.cpp  | 50 +++
 8 files changed, 116 insertions(+), 23 deletions(-)

diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp 
b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 754e8c287c5148..db516a1f62a357 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -10,6 +10,7 @@
 #include "SourceCode.h"
 #include "TestTU.h"
 #include "support/TestTracer.h"
+#include "clang/AST/ASTConcept.h"
 #include "clang/AST/Decl.h"
 #include "llvm/Support/Casting.h"
 #include "gmock/gmock.h"
@@ -893,6 +894,33 @@ TEST(SelectionTest, DeclContextLambda) {
   EXPECT_TRUE(ST.commonAncestor()->getDeclContext().isFunctionOrMethod());
 }
 
+TEST(SelectionTest, UsingConcepts) {
+  llvm::Annotations Test(R"cpp(
+namespace ns {
+template 
+concept Foo = true;
+}
+
+using ns::Foo;
+
+template 
+auto Func(Fo^o auto V) -> Fo^o decltype(auto) {
+  Fo^o auto W = V;
+  return W;
+}
+)cpp");
+  auto TU = TestTU::withCode(Test.code());
+  TU.ExtraArgs.emplace_back("-std=c++2c");
+  auto AST = TU.build();
+  for (auto Point : Test.points()) {
+auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
+ Point, Point);
+auto *C = ST.commonAncestor()->ASTNode.get();
+EXPECT_TRUE(C && C->getFoundDecl() &&
+C->getFoundDecl()->getKind() == Decl::UsingShadow);
+  }
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 690fc7ed271a3d..faee6e048229c2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -347,6 +347,7 @@ Bug Fixes to C++ Support
 
 Bug Fixes to AST Handling
 ^
+- Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. 
(#GH82628)
 
 Miscellaneous Bug Fixes
 ^^^
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index cfc1c3b3494788..00506d6ef227db 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9207,6 +9207,7 @@ class Sema final {
   bool AttachTypeConstraint(NestedNameSpecifierLoc NS,
 DeclarationNameInfo NameInfo,
 ConceptDecl *NamedConcept,
+NamedDecl *FoundDecl,
 const TemplateArgumentListInfo *TemplateArgs,
 TemplateTypeParmDecl *ConstrainedParameter,
 SourceLocation EllipsisLoc);
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1f4a041e88dfff..5850cd0ab6b9aa 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1192,9 +1192,13 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, 
CXXScopeSpec ,
 return ParsedType::make(T);
   }
 
-  if (isa(FirstDecl))
+  if (isa(FirstDecl)) {
+// We want to preserve the UsingShadowDecl for concepts.
+if (auto *USD = dyn_cast(Result.getRepresentativeDecl()))
+  return NameClassification::Concept(TemplateName(USD));
 return NameClassification::Concept(
 TemplateName(cast(FirstDecl)));
+  }
 
   if (auto *EmptyD = dyn_cast(FirstDecl)) {
 (void)DiagnoseUseOfDecl(EmptyD, NameLoc);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d62095558d0ffb..ad7055226f2631 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -1156,6 +1156,7 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec ,
 
   TemplateName TN = TypeConstr->Template.get();
   ConceptDecl *CD = cast(TN.getAsTemplateDecl());
+  UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
 
   DeclarationNameInfo ConceptName(DeclarationName(TypeConstr->Name),
   TypeConstr->TemplateNameLoc);
@@ -1174,15 +1175,15 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec ,
   }
   return AttachTypeConstraint(
   SS.isSet() ? SS.getWithLocInContext(Context) : NestedNameSpecifierLoc(),
-  ConceptName, CD,
+  ConceptName, CD, /*FoundDecl=*/USD,
   TypeConstr->LAngleLoc.isValid() ?  : nullptr,
   ConstrainedParameter, 

[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread via cfe-commits

github-actions[bot] wrote:




:warning: C/C++ code formatter, clang-format found issues in your code. 
:warning:



You can test this locally with the following command:


``bash
git-clang-format --diff fd3eaf76ba3392a4406247d996e757ef49f7a8b2 
6469dca42dae503bf08a65e55d60ccf48e012f25 -- 
clang-tools-extra/clangd/unittests/SelectionTests.cpp 
clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp 
clang/lib/Sema/SemaTemplate.cpp clang/lib/Sema/SemaTemplateInstantiate.cpp 
clang/lib/Sema/SemaType.cpp clang/test/AST/ast-dump-concepts.cpp
``





View the diff from clang-format here.


``diff
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 00506d6ef2..6826e917b7 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9206,8 +9206,7 @@ public:
 
   bool AttachTypeConstraint(NestedNameSpecifierLoc NS,
 DeclarationNameInfo NameInfo,
-ConceptDecl *NamedConcept,
-NamedDecl *FoundDecl,
+ConceptDecl *NamedConcept, NamedDecl *FoundDecl,
 const TemplateArgumentListInfo *TemplateArgs,
 TemplateTypeParmDecl *ConstrainedParameter,
 SourceLocation EllipsisLoc);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index ad7055226f..c626c3cf85 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -1235,8 +1235,7 @@ static ExprResult formImmediatelyDeclaredConstraint(
 /// of arguments for the named concept).
 bool Sema::AttachTypeConstraint(NestedNameSpecifierLoc NS,
 DeclarationNameInfo NameInfo,
-ConceptDecl *NamedConcept,
-NamedDecl *FoundDecl,
+ConceptDecl *NamedConcept, NamedDecl 
*FoundDecl,
 const TemplateArgumentListInfo *TemplateArgs,
 TemplateTypeParmDecl *ConstrainedParameter,
 SourceLocation EllipsisLoc) {

``




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


[clang] [clang-tools-extra] [concepts] Preserve the FoundDecl of ConceptReference properly (PR #85032)

2024-03-13 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 created 
https://github.com/llvm/llvm-project/pull/85032

Draft for CI.
Addresses https://github.com/llvm/llvm-project/issues/82628

>From 6469dca42dae503bf08a65e55d60ccf48e012f25 Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Wed, 13 Mar 2024 13:47:33 +0800
Subject: [PATCH] [concepts] Preserve the FoundDecl of ConceptReference
 properly

---
 .../clangd/unittests/SelectionTests.cpp   | 28 +++
 clang/docs/ReleaseNotes.rst   |  1 +
 clang/include/clang/Sema/Sema.h   |  1 +
 clang/lib/Sema/SemaDecl.cpp   |  6 ++-
 clang/lib/Sema/SemaTemplate.cpp   | 42 +---
 clang/lib/Sema/SemaTemplateInstantiate.cpp|  3 +-
 clang/lib/Sema/SemaType.cpp   |  8 ++-
 clang/test/AST/ast-dump-concepts.cpp  | 50 +++
 8 files changed, 116 insertions(+), 23 deletions(-)

diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp 
b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 754e8c287c5148..db516a1f62a357 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -10,6 +10,7 @@
 #include "SourceCode.h"
 #include "TestTU.h"
 #include "support/TestTracer.h"
+#include "clang/AST/ASTConcept.h"
 #include "clang/AST/Decl.h"
 #include "llvm/Support/Casting.h"
 #include "gmock/gmock.h"
@@ -893,6 +894,33 @@ TEST(SelectionTest, DeclContextLambda) {
   EXPECT_TRUE(ST.commonAncestor()->getDeclContext().isFunctionOrMethod());
 }
 
+TEST(SelectionTest, UsingConcepts) {
+  llvm::Annotations Test(R"cpp(
+namespace ns {
+template 
+concept Foo = true;
+}
+
+using ns::Foo;
+
+template 
+auto Func(Fo^o auto V) -> Fo^o decltype(auto) {
+  Fo^o auto W = V;
+  return W;
+}
+)cpp");
+  auto TU = TestTU::withCode(Test.code());
+  TU.ExtraArgs.emplace_back("-std=c++2c");
+  auto AST = TU.build();
+  for (auto Point : Test.points()) {
+auto ST = SelectionTree::createRight(AST.getASTContext(), AST.getTokens(),
+ Point, Point);
+auto *C = ST.commonAncestor()->ASTNode.get();
+EXPECT_TRUE(C && C->getFoundDecl() &&
+C->getFoundDecl()->getKind() == Decl::UsingShadow);
+  }
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 690fc7ed271a3d..faee6e048229c2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -347,6 +347,7 @@ Bug Fixes to C++ Support
 
 Bug Fixes to AST Handling
 ^
+- Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. 
(#GH82628)
 
 Miscellaneous Bug Fixes
 ^^^
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index cfc1c3b3494788..00506d6ef227db 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9207,6 +9207,7 @@ class Sema final {
   bool AttachTypeConstraint(NestedNameSpecifierLoc NS,
 DeclarationNameInfo NameInfo,
 ConceptDecl *NamedConcept,
+NamedDecl *FoundDecl,
 const TemplateArgumentListInfo *TemplateArgs,
 TemplateTypeParmDecl *ConstrainedParameter,
 SourceLocation EllipsisLoc);
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1f4a041e88dfff..5850cd0ab6b9aa 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1192,9 +1192,13 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, 
CXXScopeSpec ,
 return ParsedType::make(T);
   }
 
-  if (isa(FirstDecl))
+  if (isa(FirstDecl)) {
+// We want to preserve the UsingShadowDecl for concepts.
+if (auto *USD = dyn_cast(Result.getRepresentativeDecl()))
+  return NameClassification::Concept(TemplateName(USD));
 return NameClassification::Concept(
 TemplateName(cast(FirstDecl)));
+  }
 
   if (auto *EmptyD = dyn_cast(FirstDecl)) {
 (void)DiagnoseUseOfDecl(EmptyD, NameLoc);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d62095558d0ffb..ad7055226f2631 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -1156,6 +1156,7 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec ,
 
   TemplateName TN = TypeConstr->Template.get();
   ConceptDecl *CD = cast(TN.getAsTemplateDecl());
+  UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
 
   DeclarationNameInfo ConceptName(DeclarationName(TypeConstr->Name),
   TypeConstr->TemplateNameLoc);
@@ -1174,15 +1175,15 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec ,
   }
   return AttachTypeConstraint(
   SS.isSet() ? SS.getWithLocInContext(Context) : NestedNameSpecifierLoc(),
-  ConceptName, CD,
+  ConceptName, CD, /*FoundDecl=*/USD,