c++: generic lambda, local class, __func__ [PR108242]
Here we are trying to do name lookup in a deferred instantiation of t() and failing to find __func__. tsubst_expr already tries to instantiate members of local classes, but was failing with the partial instantiation of generic lambdas. PR c++/108242 gcc/cp/ChangeLog: * pt.cc (tsubst_expr) [TAG_DEFN]: Handle partial instantiation. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/lambda-generic-func2.C: New test.
This commit is contained in:
parent
1cc8814098
commit
b323f52ccf
2 changed files with 22 additions and 1 deletions
|
@ -19341,7 +19341,10 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|||
|
||||
case TAG_DEFN:
|
||||
tmp = tsubst (TREE_TYPE (t), args, complain, NULL_TREE);
|
||||
if (CLASS_TYPE_P (tmp))
|
||||
if (dependent_type_p (tmp))
|
||||
/* This is a partial instantiation, try again when full. */
|
||||
add_stmt (build_min (TAG_DEFN, tmp));
|
||||
else if (CLASS_TYPE_P (tmp))
|
||||
{
|
||||
/* Local classes are not independent templates; they are
|
||||
instantiated along with their containing function. And this
|
||||
|
|
18
gcc/testsuite/g++.dg/cpp1y/lambda-generic-func2.C
Normal file
18
gcc/testsuite/g++.dg/cpp1y/lambda-generic-func2.C
Normal file
|
@ -0,0 +1,18 @@
|
|||
// PR c++/108242
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
template<int F>
|
||||
void my_fun()
|
||||
{
|
||||
[&](auto) {
|
||||
static constexpr char const* fun_name = __func__;
|
||||
struct t
|
||||
{
|
||||
t() { fun_name; };
|
||||
} t1;
|
||||
}(12);
|
||||
}
|
||||
|
||||
int main() {
|
||||
my_fun<1>();
|
||||
}
|
Loading…
Add table
Reference in a new issue