mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 00:16:05 +00:00

Try to fix https://github.com/llvm/llvm-project/issues/84368 When visiting class members in `TemplateDeclInstantiator::VisitClassTemplateDecl` during `Sema::InstantiateClass`, we miss to set attribute of friend declaration if it is(`isFriend` is true). This will lead to `Sema::AreConstraintExpressionsEqual` return false when invoked in `MatchTemplateParameterKind`. Because it makes `Sema::getTemplateInstantiationArgs` returns incorrect template argument(`MultiLevelTemplateArgumentList`). When we handle `CXXRecordDecl` In `Sema::getTemplateInstantiationArgs`, friend declaration(its parent context is `FileContext`) makes us to choose `LexicalDeclContext` not `DeclContext` and this is what we want. Co-authored-by: huqizhi <836744285@qq.com>
17 lines
398 B
C++
17 lines
398 B
C++
// RUN: %clang_cc1 -std=c++20 -verify %s
|
|
// RUN: %clang_cc1 -std=c++23 -verify %s
|
|
// expected-no-diagnostics
|
|
|
|
template<class T> concept IsOk = requires() { typename T::Float; };
|
|
|
|
template<IsOk T> struct Thing;
|
|
|
|
template<IsOk T> struct Foobar {
|
|
template<int> struct Inner {
|
|
template<IsOk T2> friend struct Thing;
|
|
};
|
|
};
|
|
|
|
struct MyType { using Float=float; };
|
|
Foobar<MyType>::Inner<0> foobar;
|