[clang] 565ddde - Revert "[clang] Substitute alias templates from correct context (#74335)"

via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 6 08:51:52 PST 2023


Author: Podchishchaeva, Mariya
Date: 2023-12-06T08:49:17-08:00
New Revision: 565dddec6396d84befa122aa69634b055a60da17

URL: https://github.com/llvm/llvm-project/commit/565dddec6396d84befa122aa69634b055a60da17
DIFF: https://github.com/llvm/llvm-project/commit/565dddec6396d84befa122aa69634b055a60da17.diff

LOG: Revert "[clang] Substitute alias templates from correct context (#74335)"

It was reported in the PR that commit caused clang giving errors for
code previously considered valid.
This reverts commit 6b1aa319754e76366edd88e10034e0539710d946.

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/SemaCXXScopeSpec.cpp
    clang/lib/Sema/SemaTemplate.cpp
    clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp
    clang/test/SemaCXX/alias-template.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b3c7552f2efe6..89ea2f0930cec 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -658,9 +658,6 @@ Bug Fixes in This Version
   Fixes (`#64467 <https://github.com/llvm/llvm-project/issues/64467>`_)
 - Clang's ``-Wchar-subscripts`` no longer warns on chars whose values are known non-negative constants.
   Fixes (`#18763 <https://github.com/llvm/llvm-project/issues/18763>`_)
-- Fixed false positive error emitted when templated alias inside a class
-  used private members of the same class.
-  Fixes (`#41693 <https://github.com/llvm/llvm-project/issues/41693>`_)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp b/clang/lib/Sema/SemaCXXScopeSpec.cpp
index 4bd96722a4b67..44a40215b90df 100644
--- a/clang/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp
@@ -30,20 +30,6 @@ static CXXRecordDecl *getCurrentInstantiationOf(QualType T,
     return nullptr;
 
   const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
-  if (isa<TemplateSpecializationType>(Ty)) {
-    if (auto *Record = dyn_cast<CXXRecordDecl>(CurContext)) {
-      if (isa<ClassTemplatePartialSpecializationDecl>(Record) ||
-          Record->getDescribedClassTemplate()) {
-        const Type *ICNT = Record->getTypeForDecl();
-        QualType Injected =
-            cast<InjectedClassNameType>(ICNT)->getInjectedSpecializationType();
-
-        if (Ty == Injected->getCanonicalTypeInternal().getTypePtr())
-          return Record;
-      }
-    }
-  }
-
   if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
     CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
     if (!Record->isDependentContext() ||
@@ -51,12 +37,10 @@ static CXXRecordDecl *getCurrentInstantiationOf(QualType T,
       return Record;
 
     return nullptr;
-  }
-
-  if (isa<InjectedClassNameType>(Ty))
+  } else if (isa<InjectedClassNameType>(Ty))
     return cast<InjectedClassNameType>(Ty)->getDecl();
-
-  return nullptr;
+  else
+    return nullptr;
 }
 
 /// Compute the DeclContext that is associated with the given type.

diff  --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index a586014e0cb1b..09bbf14d39af5 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3990,16 +3990,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
     if (Inst.isInvalid())
       return QualType();
 
-    {
-      bool ForLambdaCallOperator = false;
-      if (const auto *Rec = dyn_cast<CXXRecordDecl>(Pattern->getDeclContext()))
-        ForLambdaCallOperator = Rec->isLambda();
-      Sema::ContextRAII SavedContext(*this, Pattern->getDeclContext(),
-                                     !ForLambdaCallOperator);
-      CanonType =
-          SubstType(Pattern->getUnderlyingType(), TemplateArgLists,
-                    AliasTemplate->getLocation(), AliasTemplate->getDeclName());
-    }
+    CanonType = SubstType(Pattern->getUnderlyingType(),
+                          TemplateArgLists, AliasTemplate->getLocation(),
+                          AliasTemplate->getDeclName());
     if (CanonType.isNull()) {
       // If this was enable_if and we failed to find the nested type
       // within enable_if in a SFINAE context, dig out the specific

diff  --git a/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp b/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp
index 2b33a4ef566da..2d46502e1d9b3 100644
--- a/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp
+++ b/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp
@@ -2,12 +2,11 @@
 
 // The example given in the standard (this is rejected for other reasons anyway).
 template<class T> struct A;
-template<class T> using B = typename A<T>::U; // expected-error {{no type named 'U' in 'A<short>'}}
-                                              // expected-note at -1 {{in instantiation of template class 'A<short>' requested here}}
+template<class T> using B = typename A<T>::U; // expected-error {{no type named 'U' in 'A<T>'}}
 template<class T> struct A {
   typedef B<T> U; // expected-note {{in instantiation of template type alias 'B' requested here}}
 };
-B<short> b; // expected-note {{in instantiation of template type alias 'B' requested here}}
+B<short> b;
 
 template<typename T> using U = int;
 

diff  --git a/clang/test/SemaCXX/alias-template.cpp b/clang/test/SemaCXX/alias-template.cpp
index cd415c6cd4e9b..5189405e23db5 100644
--- a/clang/test/SemaCXX/alias-template.cpp
+++ b/clang/test/SemaCXX/alias-template.cpp
@@ -192,53 +192,3 @@ 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'}}
 }
-
-namespace GH41693 {
-struct S {
-private:
-  template <typename> static constexpr void Impl() {}
-
-public:
-  template <typename X> using U = decltype(Impl<X>());
-};
-
-using X = S::U<void>;
-struct Y {
-private:
-    static constexpr int x=0;
-
-    template <typename>
-    static constexpr int y=0;
-
-    template <typename>
-    static constexpr int foo();
-
-public:
-    template <typename U>
-    using bar1 = decltype(foo<U>());
-    using bar2 = decltype(x);
-    template <typename U>
-    using bar3 = decltype(y<U>);
-};
-
-
-using type1 = Y::bar1<float>;
-using type2 = Y::bar2;
-using type3 = Y::bar3<float>;
-
-struct theFriend{
-    template<class T>
-    using theAlias = decltype(&T::i);
-};
-
-class theC{
-  int i;
-  public:
-  friend struct theFriend;
-};
-
-int foo(){
-  (void)sizeof(theFriend::theAlias<theC>);
-}
-
-}


        


More information about the cfe-commits mailing list