llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Krystian Stasiowski (sdkrystian)

<details>
<summary>Changes</summary>

When compiling the following with `-fms-compatibility`:
```cpp
template&lt;typename T&gt; struct C;

// Test lookup with incomplete lookup context
template&lt;typename T&gt;
auto C&lt;T&gt;::f() -&gt; 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.


---
Full diff: https://github.com/llvm/llvm-project/pull/83024.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaExpr.cpp (+1-1) 
- (modified) clang/test/SemaTemplate/ms-lookup-template-base-classes.cpp (+7) 


``````````diff
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@-1 {{out-of-line 
definition of 'f' from class 'C<T>' without definition}}
+
 }
 
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/83024
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to