Message ID | a1c6dfd0-7807-5320-ec59-99ae8fb4e0db@oracle.com |
---|---|
State | New |
Headers | show |
Series | [C++] PR 82293 ("[8 Regression] ICE in nonlambda_method_basetype at gcc/cp/lambda.c:886") | expand |
OK. On Wed, Nov 22, 2017 at 9:49 AM, Paolo Carlini <paolo.carlini@oracle.com> wrote: > Hi, > > this ICE on valid is triggered by the existing cpp0x/lambda/lambda-ice20.C > when -Wshadow is requested. Today I confirmed that it can be reproduced only > after r251433, the "Reimplement handling of lambdas in templates." patch: > then, as part of tsubst_lambda_expr, do_pushdecl calls check_local_shadow > which in turn checks nonlambda_method_basetype and at that time > current_class_type is null. I believe this is just something which we have > to handle in the obvious way: indeed, most other uses of LAMBDA_TYPE_P are > already checking first that the argument is non-null, see, for example, the > related current_nonlambda_class_type. Tested x86_64-linux. > > Thanks, Paolo. > > /////////////////////// > >
Index: cp/lambda.c =================================================================== --- cp/lambda.c (revision 255053) +++ cp/lambda.c (working copy) @@ -921,7 +921,7 @@ nonlambda_method_basetype (void) return NULL_TREE; type = current_class_type; - if (!LAMBDA_TYPE_P (type)) + if (!type || !LAMBDA_TYPE_P (type)) return type; /* Find the nearest enclosing non-lambda function. */ Index: testsuite/g++.dg/cpp0x/lambda/lambda-ice24.C =================================================================== --- testsuite/g++.dg/cpp0x/lambda/lambda-ice24.C (nonexistent) +++ testsuite/g++.dg/cpp0x/lambda/lambda-ice24.C (working copy) @@ -0,0 +1,12 @@ +// PR c++/82293 +// { dg-do compile { target c++11 } } +// { dg-options "-Wshadow" } + +template <typename> +struct S { + int f{[this](){return 42;}()}; +}; + +int main(){ + return S<int>{}.f; +}