forked from OSchip/llvm-project
[clang] Add cxx scope if needed for requires clause.
Fixes issue #55216. Patch by Luke Nihlen! (luken@google.com, luken-google@) Reviewed By: #clang-language-wg, aaron.ballman Differential Revision: https://reviews.llvm.org/D132503
This commit is contained in:
parent
b5b6ef1500
commit
7aa3270622
|
@ -171,6 +171,8 @@ C++20 Feature Support
|
|||
Note: The handling of deleted functions is not yet compliant, as Clang
|
||||
does not implement `DR1496 <https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1496>`_
|
||||
and `DR1734 <https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1734>`_.
|
||||
- Class member variables are now in scope when parsing requires clauses. Fixes
|
||||
`GH55216 <https://github.com/llvm/llvm-project/issues/55216>`_.
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -289,8 +289,14 @@ Decl *Parser::ParseSingleDeclarationAfterTemplate(
|
|||
|
||||
LateParsedAttrList LateParsedAttrs(true);
|
||||
if (DeclaratorInfo.isFunctionDeclarator()) {
|
||||
if (Tok.is(tok::kw_requires))
|
||||
if (Tok.is(tok::kw_requires)) {
|
||||
CXXScopeSpec &ScopeSpec = DeclaratorInfo.getCXXScopeSpec();
|
||||
DeclaratorScopeObj DeclScopeObj(*this, ScopeSpec);
|
||||
if (ScopeSpec.isValid() &&
|
||||
Actions.ShouldEnterDeclaratorScope(getCurScope(), ScopeSpec))
|
||||
DeclScopeObj.EnterDeclaratorScope();
|
||||
ParseTrailingRequiresClause(DeclaratorInfo);
|
||||
}
|
||||
|
||||
MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ struct A {
|
|||
struct AA;
|
||||
enum E : int;
|
||||
static int x;
|
||||
static constexpr int z = 16;
|
||||
|
||||
template <typename> requires true
|
||||
void Mfoo();
|
||||
|
@ -24,6 +25,8 @@ struct A {
|
|||
|
||||
template <typename TT> requires true
|
||||
using MQ = M<TT>;
|
||||
|
||||
constexpr int bazz() requires (z == 16);
|
||||
};
|
||||
|
||||
template <typename T> requires (!0)
|
||||
|
@ -56,6 +59,9 @@ int x = 0;
|
|||
template <typename T> requires true
|
||||
using Q = A<T>;
|
||||
|
||||
template<typename T> requires (!0)
|
||||
constexpr int A<T>::bazz() requires (z == 16) { return z; }
|
||||
|
||||
struct C {
|
||||
template <typename> requires true
|
||||
void Mfoo();
|
||||
|
|
Loading…
Reference in New Issue