This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG85960043d594: [clang] Add the check of membership in
decltype for the issue #58674# (authored by lime, committed by erichkeane).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D137531/new/
https://reviews.llvm.org/D137531
Files:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/decltype.cpp
Index: clang/test/SemaCXX/decltype.cpp
===================================================================
--- clang/test/SemaCXX/decltype.cpp
+++ clang/test/SemaCXX/decltype.cpp
@@ -101,6 +101,44 @@
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 {
};
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -2692,20 +2692,34 @@
// 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;
- 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());
+ 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;
+ }
if (MightBeImplicitMember)
return BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc,
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -331,6 +331,9 @@
`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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits