Hi! Apparently for methods convert_default_arg index should be counted from after the this argument rather than including that; the new pt.c code now ICEs if we pass a wrong index.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk. 2017-11-07 Jakub Jelinek <ja...@redhat.com> PR c++/82835 * cp-gimplify.c (cxx_omp_clause_apply_fn): For methods pass i - 1 to convert_default_arg instead of i. * testsuite/libgomp.c++/pr82835.C: New test. --- gcc/cp/cp-gimplify.c.jj 2017-11-06 17:24:15.000000000 +0100 +++ gcc/cp/cp-gimplify.c 2017-11-07 15:48:43.557460115 +0100 @@ -1717,6 +1717,7 @@ cxx_omp_clause_apply_fn (tree fn, tree a if (arg2) defparm = TREE_CHAIN (defparm); + bool is_method = TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE; if (TREE_CODE (TREE_TYPE (arg1)) == ARRAY_TYPE) { tree inner_type = TREE_TYPE (arg1); @@ -1765,8 +1766,8 @@ cxx_omp_clause_apply_fn (tree fn, tree a for (parm = defparm; parm && parm != void_list_node; parm = TREE_CHAIN (parm), i++) argarray[i] = convert_default_arg (TREE_VALUE (parm), - TREE_PURPOSE (parm), fn, i, - tf_warning_or_error); + TREE_PURPOSE (parm), fn, + i - is_method, tf_warning_or_error); t = build_call_a (fn, i, argarray); t = fold_convert (void_type_node, t); t = fold_build_cleanup_point_expr (TREE_TYPE (t), t); @@ -1798,8 +1799,8 @@ cxx_omp_clause_apply_fn (tree fn, tree a for (parm = defparm; parm && parm != void_list_node; parm = TREE_CHAIN (parm), i++) argarray[i] = convert_default_arg (TREE_VALUE (parm), - TREE_PURPOSE (parm), - fn, i, tf_warning_or_error); + TREE_PURPOSE (parm), fn, + i - is_method, tf_warning_or_error); t = build_call_a (fn, i, argarray); t = fold_convert (void_type_node, t); return fold_build_cleanup_point_expr (TREE_TYPE (t), t); --- libgomp/testsuite/libgomp.c++/pr82835.C.jj 2017-11-07 16:05:07.962354325 +0100 +++ libgomp/testsuite/libgomp.c++/pr82835.C 2017-11-07 16:05:01.000000000 +0100 @@ -0,0 +1,34 @@ +// PR c++/82835 +// { dg-do run } + +int a, b; + +template <class> +struct C { + C (int x = a) : c (5) { if (x != 137) __builtin_abort (); } + int c; +}; + +struct D { + void foo (); + int d; +}; + +void +D::foo () +{ + C<int> c; +#pragma omp for private (c) + for (b = 0; b < d; b++) + c.c++; +} + +int +main () +{ + a = 137; + D d; + d.d = 16; + d.foo (); + return 0; +} Jakub