Revert "[clang] Add the check of membership in decltype for the issue #58674#"
authorErich Keane <erich.keane@intel.com>
Wed, 4 Jan 2023 19:43:40 +0000 (11:43 -0800)
committerErich Keane <erich.keane@intel.com>
Wed, 4 Jan 2023 19:44:23 +0000 (11:44 -0800)
This reverts commit 85960043d594fc12d340ccb66a30861b023ab496.

The powerpc64le self-built buildbot had an assertion during self-build,
that seems like it is possibly related here, reverting so the author can
take a look.

clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/decltype.cpp

index cbf89cb..6430bf2 100644 (file)
@@ -331,9 +331,6 @@ Bug Fixes
   `Issue 58800 <https://github.com/llvm/llvm-project/issues/58800>`_
 - Fix an issue that triggers a crash if we instantiate a hidden friend functions.
   This fixes `Issue 54457 <https://github.com/llvm/llvm-project/issues/54457>`_
-- Fix an issue about ``decltype`` in the members of class templates derived from
-  templates with related parameters.
-  `Issue 58674 <https://github.com/llvm/llvm-project/issues/58674>`_
 
 Improvements to Clang's diagnostics
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
index 39ba75a..94f5200 100644 (file)
@@ -2692,34 +2692,20 @@ Sema::ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
   // to get this right here so that we don't end up making a
   // spuriously dependent expression if we're inside a dependent
   // instance method.
-  //
-  // We also don't need to do this if R resolved to a member in another
-  // class, which can happen in an unevaluated operand:
-  //
-  // C++ [expr.prim.id]p3.3:
-  //   If that id-expression denotes a non-static data member and it
-  //   appears in an unevaluated operand.
   if (!R.empty() && (*R.begin())->isCXXClassMember()) {
-    bool MightBeImplicitMember = true, CheckField = true;
-    if (IsAddressOfOperand) {
-      MightBeImplicitMember = SS.isEmpty() && !R.isOverloadedResult();
-      CheckField = !R.isUnresolvableResult();
-    }
-    if (MightBeImplicitMember && CheckField) {
-      if (R.isSingleResult() &&
-          isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(R.getFoundDecl())) {
-        auto Class = cast<CXXRecordDecl>((*R.begin())->getDeclContext());
-        for (auto Curr = S->getLookupEntity(); Curr && !Curr->isFileContext();
-             Curr = Curr->getParent()) {
-          if (auto ThisClass = dyn_cast_if_present<CXXRecordDecl>(Curr)) {
-            if ((MightBeImplicitMember = ThisClass->Equals(Class) ||
-                                         ThisClass->isDerivedFrom(Class)))
-              break;
-          }
-        }
-      } else if (IsAddressOfOperand)
-        MightBeImplicitMember = false;
-    }
+    bool MightBeImplicitMember;
+    if (!IsAddressOfOperand)
+      MightBeImplicitMember = true;
+    else if (!SS.isEmpty())
+      MightBeImplicitMember = false;
+    else if (R.isOverloadedResult())
+      MightBeImplicitMember = false;
+    else if (R.isUnresolvableResult())
+      MightBeImplicitMember = true;
+    else
+      MightBeImplicitMember = isa<FieldDecl>(R.getFoundDecl()) ||
+                              isa<IndirectFieldDecl>(R.getFoundDecl()) ||
+                              isa<MSPropertyDecl>(R.getFoundDecl());
 
     if (MightBeImplicitMember)
       return BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc,
index 96abb60..32c61bb 100644 (file)
@@ -101,44 +101,6 @@ namespace D5789 {
   template<class T> void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'x' }))) {}
 }
 
-namespace GH58674 {
-  struct Foo {
-    float value_;
-    struct nested {
-      float value_;
-    };
-  };
-
-  template <typename T>
-  struct TemplateFoo {
-    float value_;
-  };
-
-  float bar;
-
-  template <typename T>
-  struct Animal{};
-
-  template <typename T>
-  class Cat : Animal<T> {
-    using okay = decltype(Foo::value_);
-    using also_okay = decltype(bar);
-    using okay2 = decltype(Foo::nested::value_);
-    using okay3 = decltype(TemplateFoo<T>::value_);
-  public:
-    void meow() {
-      using okay = decltype(Foo::value_);
-      using also_okay = decltype(bar);
-      using okay2 = decltype(Foo::nested::value_);
-      using okay3 = decltype(TemplateFoo<T>::value_);
-    }
-  };
-
-  void baz() {
-      Cat<void>{}.meow();
-  }
-}
-
 template<typename>
 class conditional {
 };