jyknight wrote:

Since, with the current PR, you only can see issues in edge-cases (e.g. where 
the constexpr template is defined after it's mentioned by a constexpr 
function), in order to better test all the behaviors, I've deleted the eager 
instantiation via the following patch, and then run ninja check-clang.
```
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -19152,11 +19152,6 @@ void Sema::MarkFunctionReferenced(SourceLocation Loc, 
FunctionDecl *Func,
               CodeSynthesisContexts.size())
             PendingLocalImplicitInstantiations.push_back(
                 std::make_pair(Func, PointOfInstantiation));
-          else if (Func->isConstexpr())
-            // Do not defer instantiations of constexpr functions, to avoid the
-            // expression evaluator needing to call back into Sema if it sees a
-            // call to such a function.
-            InstantiateFunctionDefinition(PointOfInstantiation, Func);
           else {
             Func->setInstantiationIsPending(true);
             PendingInstantiations.push_back(
```

IIUC, with a correct change here, lazy instantiation should be triggered in all 
cases where it's necessary, and so deleting the above should only change some 
of the notes around where instantiation was triggered, but not otherwise break 
any code.

However, that's not the case. There's a lot of errors reported. Looking at 
them, I see at least the following seemingly-distinct issues:
- annotate attribute doesn't instantiate when evaluating its 
(required-constant) argument
- enable_if attribute doesn't instantiate when evaluating its 
(required-constant) argument
- non-constexpr globals don't instantiate (as mentioned in previous review 
comment)
- There's some weird issue where a "friend" declaration with explicit 
template-args gets in the way of finding the actual definition of constexpr 
function to instantiate.
- narrowing conversion in braces or initializer-list is not being permitted 
when it should be (only allowed for constants, and without instantiation we 
can't tell if we have a constant)
- `__builtin_matrix_column_major_load` "must be a constant unsigned integer 
expression"
- Some issues with "immediate function {} used before it is defined" related to 
consteval functions.
- Also, some crashes in the -fexperimental-new-constant-interpreter mode.

https://github.com/llvm/llvm-project/pull/205557
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to