https://github.com/BaLiKfromUA updated 
https://github.com/llvm/llvm-project/pull/123533

>From e451a8869420d9240f9006eb2adb599a3e6fd9f8 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhyme...@gmail.com>
Date: Sun, 19 Jan 2025 23:13:46 +0000
Subject: [PATCH 1/4] [Clang] Reject declaring an alias template with the same
 name as its template parameter.

Fixes llvm#123423
---
 clang/docs/ReleaseNotes.rst                               | 1 +
 clang/lib/Sema/SemaDeclCXX.cpp                            | 8 ++++++++
 .../CXX/temp/temp.decls/temp.variadic/fixed-expansion.cpp | 4 ++--
 clang/test/SemaCXX/alias-template.cpp                     | 5 +++--
 4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index aa1c02d04f7caa..29e40b4ecab412 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -956,6 +956,7 @@ Bug Fixes to C++ Support
 - Fixed a crash caused by the incorrect construction of template arguments for 
CTAD alias guides when type
   constraints are applied. (#GH122134)
 - Fixed canonicalization of pack indexing types - Clang did not always 
recognized identical pack indexing. (#GH123033)
+- Clang now rejects declaring an alias template with the same name as its 
template parameter. (#GH123423)
 
 
 Bug Fixes to AST Handling
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index a867ed73bd4033..4e43a8397cec4e 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -13464,6 +13464,14 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S, 
AccessSpecifier AS,
     }
     TemplateParameterList *TemplateParams = TemplateParamLists[0];
 
+    // Check shadowing of a template parameter name
+    for (NamedDecl *TP : TemplateParams->asArray()) {
+      if (NameInfo.getName() == TP->getDeclName()) {
+        DiagnoseTemplateParameterShadow(Name.StartLocation, TP);
+        return nullptr;
+      }
+    }
+
     // Check that we can declare a template here.
     if (CheckTemplateDeclScope(S, TemplateParams))
       return nullptr;
diff --git a/clang/test/CXX/temp/temp.decls/temp.variadic/fixed-expansion.cpp 
b/clang/test/CXX/temp/temp.decls/temp.variadic/fixed-expansion.cpp
index a990c82564aa40..ab4c663d24c7d5 100644
--- a/clang/test/CXX/temp/temp.decls/temp.variadic/fixed-expansion.cpp
+++ b/clang/test/CXX/temp/temp.decls/temp.variadic/fixed-expansion.cpp
@@ -121,8 +121,8 @@ namespace PartialSpecialization {
 
 namespace FixedAliasTemplate {
   template<typename,typename,typename> struct S {};
-  template<typename T, typename U> using U = S<T, int, U>; // expected-note 
2{{template parameter is declared here}}
-  template<typename...Ts> U<Ts...> &f(U<Ts...>, Ts...); // expected-error 
2{{pack expansion used as argument for non-pack parameter of alias template}}
+  template<typename T, typename U> using Z = S<T, int, U>; // expected-note 
2{{template parameter is declared here}}
+  template<typename...Ts> Z<Ts...> &f(Z<Ts...>, Ts...); // expected-error 
2{{pack expansion used as argument for non-pack parameter of alias template}}
   S<int, int, double> &s1 = f({}, 0, 0.0); // expected-error {{no matching 
function}}
 }
 
diff --git a/clang/test/SemaCXX/alias-template.cpp 
b/clang/test/SemaCXX/alias-template.cpp
index 5189405e23db56..97134d2f3a96ad 100644
--- a/clang/test/SemaCXX/alias-template.cpp
+++ b/clang/test/SemaCXX/alias-template.cpp
@@ -65,7 +65,8 @@ namespace InFunctions {
   template<typename...T> struct S3 { // expected-note {{template parameter is 
declared here}}
     template<typename Z> using T = int; // expected-error {{declaration of 'T' 
shadows template parameter}}
   };
-  template<typename Z> using Z = Z;
+  template<typename Z> // expected-note {{template parameter is declared here}}
+  using Z = Z; // expected-error {{declaration of 'Z' shadows template 
parameter}}
 }
 
 namespace ClassNameRedecl {
@@ -191,4 +192,4 @@ int g = sfinae_me<int>(); // expected-error{{no matching 
function for call to 's
 
 namespace NullExceptionDecl {
 template<int... I> auto get = []() { try { } catch(...) {}; return I; }; // 
expected-error{{initializer contains unexpanded parameter pack 'I'}}
-}
+}
\ No newline at end of file

>From 5d2d7dca93adac1ef2d2348713f626d2f2d95f6a Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhyme...@gmail.com>
Date: Tue, 21 Jan 2025 22:38:43 +0000
Subject: [PATCH 2/4] code review remark and removal of the loop

---
 clang/lib/Sema/SemaDeclCXX.cpp        | 10 ----------
 clang/test/SemaCXX/alias-template.cpp |  2 +-
 2 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index e2e6326c5094dc..068442e66c3049 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -13406,8 +13406,6 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S, 
AccessSpecifier AS,
                                   SourceLocation UsingLoc, UnqualifiedId &Name,
                                   const ParsedAttributesView &AttrList,
                                   TypeResult Type, Decl *DeclFromDeclSpec) {
-  // Get the innermost enclosing declaration scope.
-  S = S->getDeclParent();
 
   if (Type.isInvalid())
     return nullptr;
@@ -13473,14 +13471,6 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S, 
AccessSpecifier AS,
     }
     TemplateParameterList *TemplateParams = TemplateParamLists[0];
 
-    // Check shadowing of a template parameter name
-    for (NamedDecl *TP : TemplateParams->asArray()) {
-      if (NameInfo.getName() == TP->getDeclName()) {
-        DiagnoseTemplateParameterShadow(Name.StartLocation, TP);
-        return nullptr;
-      }
-    }
-
     // Check that we can declare a template here.
     if (CheckTemplateDeclScope(S, TemplateParams))
       return nullptr;
diff --git a/clang/test/SemaCXX/alias-template.cpp 
b/clang/test/SemaCXX/alias-template.cpp
index 97134d2f3a96ad..8ceaeb9452b017 100644
--- a/clang/test/SemaCXX/alias-template.cpp
+++ b/clang/test/SemaCXX/alias-template.cpp
@@ -192,4 +192,4 @@ int g = sfinae_me<int>(); // expected-error{{no matching 
function for call to 's
 
 namespace NullExceptionDecl {
 template<int... I> auto get = []() { try { } catch(...) {}; return I; }; // 
expected-error{{initializer contains unexpanded parameter pack 'I'}}
-}
\ No newline at end of file
+}

>From 59dddfc86608488fe3a97f151ace25a22330d6b1 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhyme...@gmail.com>
Date: Wed, 22 Jan 2025 22:34:54 +0000
Subject: [PATCH 3/4] Update ReleaseNotes.rst

---
 clang/docs/ReleaseNotes.rst | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f65d1b7462224e..7898ca2a4907f6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -974,7 +974,6 @@ Bug Fixes to C++ Support
 - Fix immediate escalation not propagating through inherited constructors.  
(#GH112677)
 - Clang now rejects declaring an alias template with the same name as its 
template parameter. (#GH123423)
 
-
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 

>From b17ae6e55ccc0b213494d8e484e181382c8affb9 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhyme...@gmail.com>
Date: Fri, 24 Jan 2025 20:07:39 +0000
Subject: [PATCH 4/4] move changing of context to be after lookup but before
 chaining

---
 clang/lib/Sema/SemaDeclCXX.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 068442e66c3049..08065e3cad2bb3 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -13456,6 +13456,9 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S, 
AccessSpecifier AS,
   CheckTypedefForVariablyModifiedType(S, NewTD);
   Invalid |= NewTD->isInvalidDecl();
 
+  // Get the innermost enclosing declaration scope.
+  S = S->getDeclParent();
+
   bool Redeclaration = false;
 
   NamedDecl *NewND;

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

Reply via email to