[clang] 3ba051b - Revert "[clang] Add the check of membership in decltype for the issue #58674#"
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 4 11:44:32 PST 2023
Author: Erich Keane
Date: 2023-01-04T11:44:23-08:00
New Revision: 3ba051b15bd3476f72ad534ffb8ca2e12457620f
URL: https://github.com/llvm/llvm-project/commit/3ba051b15bd3476f72ad534ffb8ca2e12457620f
DIFF: https://github.com/llvm/llvm-project/commit/3ba051b15bd3476f72ad534ffb8ca2e12457620f.diff
LOG: Revert "[clang] Add the check of membership in decltype for the issue #58674#"
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.
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/decltype.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index cbf89cb342c73..6430bf2936b55 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 39ba75a557df6..94f52004cf6c2 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -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,
diff --git a/clang/test/SemaCXX/decltype.cpp b/clang/test/SemaCXX/decltype.cpp
index 96abb60836e40..32c61bbccc842 100644
--- a/clang/test/SemaCXX/decltype.cpp
+++ b/clang/test/SemaCXX/decltype.cpp
@@ -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 {
};
More information about the cfe-commits
mailing list