[clang] ce4740d - [Clang][Sema] Fix crash when MS dependent base class lookup occurs in an incomplete context (#83024)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 26 11:01:51 PST 2024
Author: Krystian Stasiowski
Date: 2024-02-26T14:01:48-05:00
New Revision: ce4740d3e31e936aa93c115f63bf223c74c9dc20
URL: https://github.com/llvm/llvm-project/commit/ce4740d3e31e936aa93c115f63bf223c74c9dc20
DIFF: https://github.com/llvm/llvm-project/commit/ce4740d3e31e936aa93c115f63bf223c74c9dc20.diff
LOG: [Clang][Sema] Fix crash when MS dependent base class lookup occurs in an incomplete context (#83024)
When compiling the following with `-fms-compatibility`:
```
template<typename T> struct C;
// Test lookup with incomplete lookup context
template<typename T>
auto C<T>::f() -> decltype(x) { }
```
An assert fails because `CXXRecordDecl::hasAnyDependentBases` is called
on an incomplete class. This patch ensures we don't perform unqualified
lookup into dependent base classes when the lookup context is
incomplete.
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaTemplate/ms-lookup-template-base-classes.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 9e67bbb7895040..515dffa28df186 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -283,6 +283,8 @@ Bug Fixes to C++ Support
(`#78524 <https://github.com/llvm/llvm-project/issues/78524>`_)
- Clang no longer instantiates the exception specification of discarded candidate function
templates when determining the primary template of an explicit specialization.
+- Fixed a crash in Microsoft compatibility mode where unqualified dependent base class
+ lookup searches the bases of an incomplete class.
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 816ee9e281359a..403839f77a2b7c 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2653,7 +2653,7 @@ recoverFromMSUnqualifiedLookup(Sema &S, ASTContext &Context,
RD = ThisType->getPointeeType()->getAsCXXRecordDecl();
else if (auto *MD = dyn_cast<CXXMethodDecl>(S.CurContext))
RD = MD->getParent();
- if (!RD || !RD->hasAnyDependentBases())
+ if (!RD || !RD->hasDefinition() || !RD->hasAnyDependentBases())
return nullptr;
// Diagnose this as unqualified lookup into a dependent base class. If 'this'
diff --git a/clang/test/SemaTemplate/ms-lookup-template-base-classes.cpp b/clang/test/SemaTemplate/ms-lookup-template-base-classes.cpp
index 7856a0a16307be..534a5dc9ddc10d 100644
--- a/clang/test/SemaTemplate/ms-lookup-template-base-classes.cpp
+++ b/clang/test/SemaTemplate/ms-lookup-template-base-classes.cpp
@@ -71,6 +71,13 @@ class B : public A<T> {
template class B<int>;
+template<typename T> struct C;
+
+// Test lookup with incomplete lookup context
+template<typename T>
+auto C<T>::f() -> decltype(x) { } // expected-error {{use of undeclared identifier 'x'}}
+ // expected-error at -1 {{out-of-line definition of 'f' from class 'C<T>' without definition}}
+
}
More information about the cfe-commits
mailing list