https://github.com/spaits updated 
https://github.com/llvm/llvm-project/pull/112166

From e9d43ef25b882071822cf3f16a988197c07967b1 Mon Sep 17 00:00:00 2001
From: Gabor Spaits <gaborspai...@gmail.com>
Date: Mon, 14 Oct 2024 10:12:42 +0200
Subject: [PATCH 1/3] Use tag name lookup for class names

This PR would fix #16855 .

I think the correct lookup to use for class names is Tag name lookup,
because it does not take namespaces into account. The current lookup
does and because of this some valid programs are not accepted.

If you think that Tag name lookup is not correct for all cases when
we are looking up types based on class names then we can only
do tag name lookup when looking up class names for inheritance.
In case of inheritance:
```
[class.derived]p2 says:

"During the lookup for a base class name, non-type names are ignored."
```
---
 clang/lib/Sema/SemaDecl.cpp         |  8 +++++---
 clang/test/CXX/class.derived/p2.cpp | 12 ++++++++++++
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 118873bc93ad4b..5cce92ef118951 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -357,9 +357,10 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, 
SourceLocation NameLoc,
       return nullptr;
   }
 
-  // FIXME: LookupNestedNameSpecifierName isn't the right kind of
-  // lookup for class-names.
-  LookupNameKind Kind = isClassName ? LookupNestedNameSpecifierName :
+  // In case we know that the identifier is a class name, we know that it is
+  // a type declaration (struct, class, union or enum) so we can use tag name
+  // lookup.
+  LookupNameKind Kind = isClassName ? LookupTagName :
                                       LookupOrdinaryName;
   LookupResult Result(*this, &II, NameLoc, Kind);
   if (LookupCtx) {
@@ -547,6 +548,7 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, 
SourceLocation NameLoc,
   if (T.isNull()) {
     // If it's not plausibly a type, suppress diagnostics.
     Result.suppressDiagnostics();
+    llvm::errs() << "Not a type\n";
     return nullptr;
   }
 
diff --git a/clang/test/CXX/class.derived/p2.cpp 
b/clang/test/CXX/class.derived/p2.cpp
index 87e0f748615456..588436c3a8d211 100644
--- a/clang/test/CXX/class.derived/p2.cpp
+++ b/clang/test/CXX/class.derived/p2.cpp
@@ -7,3 +7,15 @@ namespace PR5840 {
   int Base = 10;
   struct Derived : Base {};
 }
+
+namespace issue_number {
+  struct x {};
+  namespace
+  {
+      namespace x
+      {
+          struct y : x
+          {};
+      }
+  }
+}
\ No newline at end of file

From c690afa2c92fe1dd9a0a1b3f4e577934ac2bbcf0 Mon Sep 17 00:00:00 2001
From: Gabor Spaits <gaborspai...@gmail.com>
Date: Mon, 14 Oct 2024 10:26:18 +0200
Subject: [PATCH 2/3] Add issue number to the test for the issue

---
 clang/test/CXX/class.derived/p2.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/CXX/class.derived/p2.cpp 
b/clang/test/CXX/class.derived/p2.cpp
index 588436c3a8d211..f63782761ae15e 100644
--- a/clang/test/CXX/class.derived/p2.cpp
+++ b/clang/test/CXX/class.derived/p2.cpp
@@ -8,7 +8,7 @@ namespace PR5840 {
   struct Derived : Base {};
 }
 
-namespace issue_number {
+namespace issue_16855 {
   struct x {};
   namespace
   {

From 18a7b2282e12767a065cb1c555168af2e561bb06 Mon Sep 17 00:00:00 2001
From: Gabor Spaits <gaborspai...@gmail.com>
Date: Mon, 14 Oct 2024 11:24:05 +0200
Subject: [PATCH 3/3] Remove debug print

---
 clang/lib/Sema/SemaDecl.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 5cce92ef118951..eb24afec5cc366 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -548,7 +548,6 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, 
SourceLocation NameLoc,
   if (T.isNull()) {
     // If it's not plausibly a type, suppress diagnostics.
     Result.suppressDiagnostics();
-    llvm::errs() << "Not a type\n";
     return nullptr;
   }
 

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

Reply via email to