Dependent access checks.
Fixes: https://github.com/llvm/llvm-project/issues/53364
We previously ignored dependent access checks to private members.
These are visible only to the RequiresExprBodyExpr (through PerformDependentDiagnositcs) and not to the individual requirements.
Non-dependent access checks.
Fixes: https://github.com/llvm/llvm-project/issues/53334
Access to members in a non-dependent context would always yield an
invalid expression. When it appears in a requires-expression, then this
is a hard error as this would always result in a substitution failure.
https://eel.is/c++draft/expr.prim.req#general-note-1
Note 1: If a requires-expression contains invalid types or expressions in its requirements, and it does not appear within the declaration of a templated entity, then the program is ill-formed. — end note]
If the substitution of template arguments into a requirement would always result in a substitution failure, the program is ill-formed; no diagnostic required.
The main issue here is the delaying of the diagnostics.
Use a ParsingDeclRAIIObject creates a separate diagnostic pool for diagnositcs associated to the RequiresExprBodyDecl.
This is important because dependent diagnostics should not be leaked/delayed to higher scopes (Eg. inside a template function or in a trailing requires). These dependent diagnostics must be attached to the DeclContext of the parameters of RequiresExpr (which is the RequiresExprBodyDecl in this case).
Non dependent diagnostics, on the other hand, should not delayed and surfaced as hard errors.
@usaxena95 This has broken the sphinx buildbot - please can you take a look? https://lab.llvm.org/buildbot/#/builders/92/builds/38512