Magellan Linux

Annotation of /trunk/gcc/patches/gcc-5.1.0-gomp-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2571 - (hide annotations) (download)
Wed Jun 10 08:34:21 2015 UTC (8 years, 11 months ago) by niro
File size: 72838 byte(s)
-upstream gomp fixes
1 niro 2571 Submitted By: Bruce Dubbs <bdubbs@liinuxfromscratch.org>
2     Date: 2015-05-23
3     Initial Package Version: 5.1.0
4     Upstream Status: Committed
5     Origin: https://patchwork.ozlabs.org/patch/469768/raw/ and
6     gcc git
7     Description: Fix acc_device_type not distinguishing between
8     "offloaded" and host code with the host_nonshm plugin.
9     Fix inline issues.
10    
11     commit adccf2e7d313263d585f63e752a4d36653d47811
12     Author: Julian Brown <julian@codesourcery.com>
13     Date: Tue Apr 21 12:40:45 2015 -0700
14    
15     Non-SHM acc_on_device fixes
16    
17     diff --git a/gcc/builtins.c b/gcc/builtins.c
18     index 6fe1456..5930fe4 100644
19     --- a/gcc/builtins.c
20     +++ b/gcc/builtins.c
21     @@ -5917,6 +5917,7 @@ expand_stack_save (void)
22     static rtx
23     expand_builtin_acc_on_device (tree exp, rtx target)
24     {
25     +#ifdef ACCEL_COMPILER
26     if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
27     return NULL_RTX;
28    
29     @@ -5925,13 +5926,8 @@ expand_builtin_acc_on_device (tree exp, rtx target)
30     /* Return (arg == v1 || arg == v2) ? 1 : 0. */
31     machine_mode v_mode = TYPE_MODE (TREE_TYPE (arg));
32     rtx v = expand_normal (arg), v1, v2;
33     -#ifdef ACCEL_COMPILER
34     v1 = GEN_INT (GOMP_DEVICE_NOT_HOST);
35     v2 = GEN_INT (ACCEL_COMPILER_acc_device);
36     -#else
37     - v1 = GEN_INT (GOMP_DEVICE_NONE);
38     - v2 = GEN_INT (GOMP_DEVICE_HOST);
39     -#endif
40     machine_mode target_mode = TYPE_MODE (integer_type_node);
41     if (!target || !register_operand (target, target_mode))
42     target = gen_reg_rtx (target_mode);
43     @@ -5945,6 +5941,9 @@ expand_builtin_acc_on_device (tree exp, rtx target)
44     emit_label (done_label);
45    
46     return target;
47     +#else
48     + return NULL;
49     +#endif
50     }
51    
52    
53     diff --git a/libgomp/oacc-init.c b/libgomp/oacc-init.c
54     index 335ffd4..157147a 100644
55     --- a/libgomp/oacc-init.c
56     +++ b/libgomp/oacc-init.c
57     @@ -29,6 +29,7 @@
58     #include "libgomp.h"
59     #include "oacc-int.h"
60     #include "openacc.h"
61     +#include "plugin/plugin-host.h"
62     #include <assert.h>
63     #include <stdlib.h>
64     #include <strings.h>
65     @@ -611,11 +612,18 @@ ialias (acc_set_device_num)
66     int
67     acc_on_device (acc_device_t dev)
68     {
69     - if (acc_get_device_type () == acc_device_host_nonshm)
70     + struct goacc_thread *thr = goacc_thread ();
71     +
72     + /* We only want to appear to be the "host_nonshm" plugin from "offloaded"
73     + code -- i.e. within a parallel region. Test a flag set by the
74     + openacc_parallel hook of the host_nonshm plugin to determine that. */
75     + if (acc_get_device_type () == acc_device_host_nonshm
76     + && thr && thr->target_tls
77     + && ((struct nonshm_thread *)thr->target_tls)->nonshm_exec)
78     return dev == acc_device_host_nonshm || dev == acc_device_not_host;
79    
80     - /* Just rely on the compiler builtin. */
81     - return __builtin_acc_on_device (dev);
82     + /* For OpenACC, libgomp is only built for the host, so this is sufficient. */
83     + return dev == acc_device_host || dev == acc_device_none;
84     }
85    
86     ialias (acc_on_device)
87     diff --git a/libgomp/plugin/plugin-host.c b/libgomp/plugin/plugin-host.c
88     index 1faf5bc..3cb4dab 100644
89     --- a/libgomp/plugin/plugin-host.c
90     +++ b/libgomp/plugin/plugin-host.c
91     @@ -44,6 +44,7 @@
92     #include <stdlib.h>
93     #include <string.h>
94     #include <stdio.h>
95     +#include <stdbool.h>
96    
97     #ifdef HOST_NONSHM_PLUGIN
98     #define STATIC
99     @@ -55,6 +56,10 @@
100     #define SELF "host: "
101     #endif
102    
103     +#ifdef HOST_NONSHM_PLUGIN
104     +#include "plugin-host.h"
105     +#endif
106     +
107     STATIC const char *
108     GOMP_OFFLOAD_get_name (void)
109     {
110     @@ -174,7 +179,10 @@ GOMP_OFFLOAD_openacc_parallel (void (*fn) (void *),
111     void *targ_mem_desc __attribute__ ((unused)))
112     {
113     #ifdef HOST_NONSHM_PLUGIN
114     + struct nonshm_thread *thd = GOMP_PLUGIN_acc_thread ();
115     + thd->nonshm_exec = true;
116     fn (devaddrs);
117     + thd->nonshm_exec = false;
118     #else
119     fn (hostaddrs);
120     #endif
121     @@ -232,11 +240,20 @@ STATIC void *
122     GOMP_OFFLOAD_openacc_create_thread_data (int ord
123     __attribute__ ((unused)))
124     {
125     +#ifdef HOST_NONSHM_PLUGIN
126     + struct nonshm_thread *thd
127     + = GOMP_PLUGIN_malloc (sizeof (struct nonshm_thread));
128     + thd->nonshm_exec = false;
129     + return thd;
130     +#else
131     return NULL;
132     +#endif
133     }
134    
135     STATIC void
136     -GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data
137     - __attribute__ ((unused)))
138     +GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data)
139     {
140     +#ifdef HOST_NONSHM_PLUGIN
141     + free (tls_data);
142     +#endif
143     }
144     diff --git a/libgomp/plugin/plugin-host.h b/libgomp/plugin/plugin-host.h
145     new file mode 100644
146     index 0000000..96955d1
147     --- /dev/null
148     +++ b/libgomp/plugin/plugin-host.h
149     @@ -0,0 +1,37 @@
150     +/* OpenACC Runtime Library: acc_device_host, acc_device_host_nonshm.
151     +
152     + Copyright (C) 2015 Free Software Foundation, Inc.
153     +
154     + Contributed by Mentor Embedded.
155     +
156     + This file is part of the GNU Offloading and Multi Processing Library
157     + (libgomp).
158     +
159     + Libgomp is free software; you can redistribute it and/or modify it
160     + under the terms of the GNU General Public License as published by
161     + the Free Software Foundation; either version 3, or (at your option)
162     + any later version.
163     +
164     + Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
165     + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
166     + FOR A PARTICULAR PURPOSE. See the GNU General Public License for
167     + more details.
168     +
169     + Under Section 7 of GPL version 3, you are granted additional
170     + permissions described in the GCC Runtime Library Exception, version
171     + 3.1, as published by the Free Software Foundation.
172     +
173     + You should have received a copy of the GNU General Public License and
174     + a copy of the GCC Runtime Library Exception along with this program;
175     + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
176     + <http://www.gnu.org/licenses/>. */
177     +
178     +#ifndef PLUGIN_HOST_H
179     +#define PLUGIN_HOST_H
180     +
181     +struct nonshm_thread
182     +{
183     + bool nonshm_exec;
184     +};
185     +
186     +#endif
187     diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c
188     index 81ea476..25cc15a 100644
189     --- a/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c
190     +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c
191     @@ -1,7 +1,3 @@
192     -/* Disable the acc_on_device builtin; we want to test the libgomp library
193     - function. */
194     -/* { dg-additional-options "-fno-builtin-acc_on_device" } */
195     -
196     #include <stdlib.h>
197     #include <openacc.h>
198    
199     diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c
200     index 184b355..6aa3bb7 100644
201     --- a/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c
202     +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c
203     @@ -1,5 +1,4 @@
204     /* { dg-do run } */
205     -/* { dg-additional-options "-fno-builtin-acc_on_device" } */
206    
207     #include <openacc.h>
208     #include <stdlib.h>
209     diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
210     index 4488818..729b685 100644
211     --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
212     +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
213     @@ -1,8 +1,4 @@
214     ! { dg-additional-options "-cpp" }
215     -! TODO: Have to disable the acc_on_device builtin for we want to test the
216     -! libgomp library function? The command line option
217     -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not for
218     -! Fortran.
219    
220     use openacc
221     implicit none
222     diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
223     index 0047a19..19ff4a5 100644
224     --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
225     +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
226     @@ -1,8 +1,4 @@
227     ! { dg-additional-options "-cpp" }
228     -! TODO: Have to disable the acc_on_device builtin for we want to test
229     -! the libgomp library function? The command line option
230     -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not
231     -! for Fortran.
232    
233     USE OPENACC
234     IMPLICIT NONE
235     diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
236     index 49d7a72..b01c553 100644
237     --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
238     +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
239     @@ -1,8 +1,4 @@
240     ! { dg-additional-options "-cpp" }
241     -! TODO: Have to disable the acc_on_device builtin for we want to test
242     -! the libgomp library function? The command line option
243     -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not
244     -! for Fortran.
245    
246     IMPLICIT NONE
247     INCLUDE "openacc_lib.h"
248    
249     --- a/gcc/c/c-parser.c 2015-04-20 18:55:33.000000000 +0200
250     +++ b/gcc/c/c-parser.c 2015-05-23 11:32:41.664037866 +0200
251     @@ -13069,12 +13069,9 @@
252     }
253     else
254     {
255     - /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
256     - change it to shared (decl) in
257     - OMP_PARALLEL_CLAUSES. */
258     - tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
259     - OMP_CLAUSE_LASTPRIVATE);
260     - OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
261     + /* Move lastprivate (decl) clause to OMP_FOR_CLAUSES. */
262     + tree l = *c;
263     + *c = OMP_CLAUSE_CHAIN (*c);
264     if (code == OMP_SIMD)
265     {
266     OMP_CLAUSE_CHAIN (l)
267     @@ -13086,7 +13083,6 @@
268     OMP_CLAUSE_CHAIN (l) = clauses;
269     clauses = l;
270     }
271     - OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
272     }
273     }
274     }
275     @@ -13771,6 +13767,7 @@
276     TREE_TYPE (ret) = void_type_node;
277     OMP_TEAMS_CLAUSES (ret) = clauses;
278     OMP_TEAMS_BODY (ret) = block;
279     + OMP_TEAMS_COMBINED (ret) = 1;
280     return add_stmt (ret);
281     }
282     }
283     --- a/gcc/calls.c 2015-04-07 23:02:12.000000000 +0200
284     +++ b/gcc/calls.c 2015-05-23 11:18:33.952634193 +0200
285     @@ -2099,6 +2099,26 @@
286     (XEXP (args[i].value, 0), size)))
287     *sibcall_failure = 1;
288    
289     + if (size % UNITS_PER_WORD == 0
290     + || MEM_ALIGN (mem) % BITS_PER_WORD == 0)
291     + move_block_to_reg (REGNO (reg), mem, nregs, args[i].mode);
292     + else
293     + {
294     + if (nregs > 1)
295     + move_block_to_reg (REGNO (reg), mem, nregs - 1,
296     + args[i].mode);
297     + rtx dest = gen_rtx_REG (word_mode, REGNO (reg) + nregs - 1);
298     + unsigned int bitoff = (nregs - 1) * BITS_PER_WORD;
299     + unsigned int bitsize = size * BITS_PER_UNIT - bitoff;
300     + rtx x = extract_bit_field (mem, bitsize, bitoff, 1,
301     + dest, word_mode, word_mode);
302     + if (BYTES_BIG_ENDIAN)
303     + x = expand_shift (LSHIFT_EXPR, word_mode, x,
304     + BITS_PER_WORD - bitsize, dest, 1);
305     + if (x != dest)
306     + emit_move_insn (dest, x);
307     + }
308     +
309     /* Handle a BLKmode that needs shifting. */
310     if (nregs == 1 && size < UNITS_PER_WORD
311     #ifdef BLOCK_REG_PADDING
312     @@ -2106,22 +2126,18 @@
313     #else
314     && BYTES_BIG_ENDIAN
315     #endif
316     - )
317     + )
318     {
319     - rtx tem = operand_subword_force (mem, 0, args[i].mode);
320     - rtx ri = gen_rtx_REG (word_mode, REGNO (reg));
321     - rtx x = gen_reg_rtx (word_mode);
322     + rtx dest = gen_rtx_REG (word_mode, REGNO (reg));
323     int shift = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
324     - enum tree_code dir = BYTES_BIG_ENDIAN ? RSHIFT_EXPR
325     - : LSHIFT_EXPR;
326     + enum tree_code dir = (BYTES_BIG_ENDIAN
327     + ? RSHIFT_EXPR : LSHIFT_EXPR);
328     + rtx x;
329    
330     - emit_move_insn (x, tem);
331     - x = expand_shift (dir, word_mode, x, shift, ri, 1);
332     - if (x != ri)
333     - emit_move_insn (ri, x);
334     + x = expand_shift (dir, word_mode, dest, shift, dest, 1);
335     + if (x != dest)
336     + emit_move_insn (dest, x);
337     }
338     - else
339     - move_block_to_reg (REGNO (reg), mem, nregs, args[i].mode);
340     }
341    
342     /* When a parameter is a block, and perhaps in other cases, it is
343     --- a/gcc/config/i386/i386.c 2015-04-17 23:55:05.000000000 +0200
344     +++ b/gcc/config/i386/i386.c 2015-05-23 11:27:55.981186322 +0200
345     @@ -2988,6 +2988,17 @@
346     return;
347     }
348    
349     + if ((stringop_alg) i == rep_prefix_8_byte
350     + && !TARGET_64BIT)
351     + {
352     + /* rep; movq isn't available in 32-bit code. */
353     + error ("stringop strategy name %s specified for option %s "
354     + "not supported for 32-bit code",
355     + alg_name,
356     + is_memset ? "-mmemset_strategy=" : "-mmemcpy_strategy=");
357     + return;
358     + }
359     +
360     input_ranges[n].max = maxs;
361     input_ranges[n].alg = (stringop_alg) i;
362     if (!strcmp (align, "align"))
363     @@ -5867,7 +5878,10 @@
364     /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
365     DFmode (2) arguments in SSE registers for a function with the
366     indicated TYPE and DECL. DECL may be NULL when calling function
367     - indirectly or considering a libcall. Otherwise return 0. */
368     + indirectly or considering a libcall. Return -1 if any FP parameter
369     + should be rejected by error. This is used in siutation we imply SSE
370     + calling convetion but the function is called from another function with
371     + SSE disabled. Otherwise return 0. */
372    
373     static int
374     ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
375     @@ -5916,14 +5930,13 @@
376     {
377     /* Refuse to produce wrong code when local function with SSE enabled
378     is called from SSE disabled function.
379     - We may work hard to work out these scenarios but hopefully
380     - it doesnot matter in practice. */
381     + FIXME: We need a way to detect these cases cross-ltrans partition
382     + and avoid using SSE calling conventions on local functions called
383     + from function with SSE disabled. For now at least delay the
384     + warning until we know we are going to produce wrong code.
385     + See PR66047 */
386     if (!TARGET_SSE && warn)
387     - {
388     - error ("calling %qD with SSE caling convention without "
389     - "SSE/SSE2 enabled", decl);
390     - return 0;
391     - }
392     + return -1;
393     return TARGET_SSE2_P (target_opts_for_fn (target->decl)
394     ->x_ix86_isa_flags) ? 2 : 1;
395     }
396     @@ -6479,6 +6492,7 @@
397     cum->bnd_regno = FIRST_BND_REG;
398     cum->bnds_in_bt = 0;
399     cum->force_bnd_pass = 0;
400     + cum->decl = fndecl;
401    
402     if (!TARGET_64BIT)
403     {
404     @@ -7424,6 +7438,7 @@
405     HOST_WIDE_INT words)
406     {
407     int res = 0;
408     + bool error_p = NULL;
409    
410     switch (mode)
411     {
412     @@ -7456,9 +7471,13 @@
413     gcc_unreachable ();
414    
415     case DFmode:
416     + if (cum->float_in_sse == -1)
417     + error_p = 1;
418     if (cum->float_in_sse < 2)
419     break;
420     case SFmode:
421     + if (cum->float_in_sse == -1)
422     + error_p = 1;
423     if (cum->float_in_sse < 1)
424     break;
425     /* FALLTHRU */
426     @@ -7514,6 +7533,14 @@
427     }
428     break;
429     }
430     + if (error_p)
431     + {
432     + cum->float_in_sse = 0;
433     + error ("calling %qD with SSE calling convention without "
434     + "SSE/SSE2 enabled", cum->decl);
435     + sorry ("this is a GCC bug that can be worked around by adding "
436     + "attribute used to function called");
437     + }
438    
439     return res;
440     }
441     @@ -7646,10 +7673,11 @@
442     (otherwise it is an extra parameter matching an ellipsis). */
443    
444     static rtx
445     -function_arg_32 (const CUMULATIVE_ARGS *cum, machine_mode mode,
446     +function_arg_32 (CUMULATIVE_ARGS *cum, machine_mode mode,
447     machine_mode orig_mode, const_tree type,
448     HOST_WIDE_INT bytes, HOST_WIDE_INT words)
449     {
450     + bool error_p = false;
451     /* Avoid the AL settings for the Unix64 ABI. */
452     if (mode == VOIDmode)
453     return constm1_rtx;
454     @@ -7690,9 +7718,13 @@
455     break;
456    
457     case DFmode:
458     + if (cum->float_in_sse == -1)
459     + error_p = 1;
460     if (cum->float_in_sse < 2)
461     break;
462     case SFmode:
463     + if (cum->float_in_sse == -1)
464     + error_p = 1;
465     if (cum->float_in_sse < 1)
466     break;
467     /* FALLTHRU */
468     @@ -7751,6 +7783,14 @@
469     }
470     break;
471     }
472     + if (error_p)
473     + {
474     + cum->float_in_sse = 0;
475     + error ("calling %qD with SSE calling convention without "
476     + "SSE/SSE2 enabled", cum->decl);
477     + sorry ("this is a GCC bug that can be worked around by adding "
478     + "attribute used to function called");
479     + }
480    
481     return NULL_RTX;
482     }
483     @@ -8230,8 +8270,15 @@
484     if ((fn || fntype) && (mode == SFmode || mode == DFmode))
485     {
486     int sse_level = ix86_function_sseregparm (fntype, fn, false);
487     - if ((sse_level >= 1 && mode == SFmode)
488     - || (sse_level == 2 && mode == DFmode))
489     + if (sse_level == -1)
490     + {
491     + error ("calling %qD with SSE caling convention without "
492     + "SSE/SSE2 enabled", fn);
493     + sorry ("this is a GCC bug that can be worked around by adding "
494     + "attribute used to function called");
495     + }
496     + else if ((sse_level >= 1 && mode == SFmode)
497     + || (sse_level == 2 && mode == DFmode))
498     regno = FIRST_SSE_REG;
499     }
500    
501     @@ -46892,15 +46939,16 @@
502     static bool
503     expand_vec_perm_blend (struct expand_vec_perm_d *d)
504     {
505     - machine_mode vmode = d->vmode;
506     + machine_mode mmode, vmode = d->vmode;
507     unsigned i, mask, nelt = d->nelt;
508     - rtx target, op0, op1, x;
509     + rtx target, op0, op1, maskop, x;
510     rtx rperm[32], vperm;
511    
512     if (d->one_operand_p)
513     return false;
514     if (TARGET_AVX512F && GET_MODE_SIZE (vmode) == 64
515     - && GET_MODE_SIZE (GET_MODE_INNER (vmode)) >= 4)
516     + && (TARGET_AVX512BW
517     + || GET_MODE_SIZE (GET_MODE_INNER (vmode)) >= 4))
518     ;
519     else if (TARGET_AVX2 && GET_MODE_SIZE (vmode) == 32)
520     ;
521     @@ -47074,8 +47122,33 @@
522     gcc_unreachable ();
523     }
524    
525     + switch (vmode)
526     + {
527     + case V8DFmode:
528     + case V8DImode:
529     + mmode = QImode;
530     + break;
531     + case V16SFmode:
532     + case V16SImode:
533     + mmode = HImode;
534     + break;
535     + case V32HImode:
536     + mmode = SImode;
537     + break;
538     + case V64QImode:
539     + mmode = DImode;
540     + break;
541     + default:
542     + mmode = VOIDmode;
543     + }
544     +
545     + if (mmode != VOIDmode)
546     + maskop = force_reg (mmode, gen_int_mode (mask, mmode));
547     + else
548     + maskop = GEN_INT (mask);
549     +
550     /* This matches five different patterns with the different modes. */
551     - x = gen_rtx_VEC_MERGE (vmode, op1, op0, GEN_INT (mask));
552     + x = gen_rtx_VEC_MERGE (vmode, op1, op0, maskop);
553     x = gen_rtx_SET (VOIDmode, target, x);
554     emit_insn (x);
555     if (target != d->target)
556     @@ -51606,7 +51679,7 @@
557     for (i = 0; i < loop->num_nodes; i++)
558     FOR_BB_INSNS (bbs[i], insn)
559     if (NONDEBUG_INSN_P (insn))
560     - FOR_EACH_SUBRTX (iter, array, insn, NONCONST)
561     + FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
562     if (const_rtx x = *iter)
563     if (MEM_P (x))
564     {
565     --- a/gcc/config/i386/i386.h 2015-02-21 01:06:53.000000000 +0100
566     +++ b/gcc/config/i386/i386.h 2015-05-23 11:26:56.002281385 +0200
567     @@ -1682,6 +1682,7 @@
568     int stdarg; /* Set to 1 if function is stdarg. */
569     enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise
570     MS_ABI for ms abi. */
571     + tree decl; /* Callee decl. */
572     } CUMULATIVE_ARGS;
573    
574     /* Initialize a variable CUM of type CUMULATIVE_ARGS
575     --- a/gcc/config/i386/sse.md 2015-04-09 23:37:28.000000000 +0200
576     +++ b/gcc/config/i386/sse.md 2015-05-23 11:18:33.954634308 +0200
577     @@ -9523,7 +9523,7 @@
578     (mult:V4DI
579     (sign_extend:V4DI
580     (vec_select:V4SI
581     - (match_operand:V8SI 1 "nonimmediate_operand" "v")
582     + (match_operand:V8SI 1 "nonimmediate_operand" "%v")
583     (parallel [(const_int 0) (const_int 2)
584     (const_int 4) (const_int 6)])))
585     (sign_extend:V4DI
586     --- a/gcc/cp/constexpr.c 2015-04-12 21:10:58.000000000 +0200
587     +++ b/gcc/cp/constexpr.c 2015-05-23 11:18:33.955634365 +0200
588     @@ -1355,7 +1355,14 @@
589     fun = DECL_CHAIN (fun))
590     if (DECL_SAVED_TREE (fun))
591     break;
592     - gcc_assert (DECL_SAVED_TREE (fun));
593     + if (!DECL_SAVED_TREE (fun))
594     + {
595     + /* cgraph/gimplification have released the DECL_SAVED_TREE
596     + for this function. Fail gracefully. */
597     + gcc_assert (ctx->quiet);
598     + *non_constant_p = true;
599     + return t;
600     + }
601     tree parms, res;
602    
603     /* Unshare the whole function body. */
604     @@ -2603,14 +2610,29 @@
605     {
606     constexpr_ctx new_ctx = *ctx;
607    
608     + tree init = TREE_OPERAND (t, 1);
609     +
610     /* First we figure out where we're storing to. */
611     tree target = TREE_OPERAND (t, 0);
612     + tree type = TREE_TYPE (target);
613     target = cxx_eval_constant_expression (ctx, target,
614     true,
615     non_constant_p, overflow_p);
616     if (*non_constant_p)
617     return t;
618    
619     + if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (target), type)
620     + && is_empty_class (type))
621     + {
622     + /* For initialization of an empty base, the original target will be
623     + *(base*)this, which the above evaluation resolves to the object
624     + argument, which has the derived type rather than the base type. In
625     + this situation, just evaluate the initializer and return, since
626     + there's no actual data to store. */
627     + return cxx_eval_constant_expression (ctx, init, false,
628     + non_constant_p, overflow_p);
629     + }
630     +
631     /* And then find the underlying variable. */
632     vec<tree,va_gc> *refs = make_tree_vector();
633     tree object = NULL_TREE;
634     @@ -2647,7 +2669,7 @@
635     *non_constant_p = true;
636     return t;
637     }
638     - tree type = TREE_TYPE (object);
639     + type = TREE_TYPE (object);
640     while (!refs->is_empty())
641     {
642     if (*valp == NULL_TREE)
643     @@ -2684,9 +2706,8 @@
644     new_ctx.object = target;
645     }
646    
647     - tree init = cxx_eval_constant_expression (&new_ctx, TREE_OPERAND (t, 1),
648     - false,
649     - non_constant_p, overflow_p);
650     + init = cxx_eval_constant_expression (&new_ctx, init, false,
651     + non_constant_p, overflow_p);
652     if (target == object)
653     /* The hash table might have moved since the get earlier. */
654     ctx->values->put (object, init);
655     --- a/gcc/cp/cvt.c 2015-01-09 21:18:42.000000000 +0100
656     +++ b/gcc/cp/cvt.c 2015-05-23 11:18:33.956634423 +0200
657     @@ -603,8 +603,20 @@
658     tree
659     cp_fold_convert (tree type, tree expr)
660     {
661     - tree conv = fold_convert (type, expr);
662     - conv = ignore_overflows (conv, expr);
663     + tree conv;
664     + if (TREE_TYPE (expr) == type)
665     + conv = expr;
666     + else if (TREE_CODE (expr) == PTRMEM_CST)
667     + {
668     + /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */
669     + conv = copy_node (expr);
670     + TREE_TYPE (conv) = type;
671     + }
672     + else
673     + {
674     + conv = fold_convert (type, expr);
675     + conv = ignore_overflows (conv, expr);
676     + }
677     return conv;
678     }
679    
680     --- a/gcc/cp/decl2.c 2015-03-19 20:12:43.000000000 +0100
681     +++ b/gcc/cp/decl2.c 2015-05-23 11:24:52.397411028 +0200
682     @@ -1175,6 +1175,10 @@
683     && is_attribute_p ("omp declare simd", name))
684     return true;
685    
686     + /* An attribute pack is clearly dependent. */
687     + if (args && PACK_EXPANSION_P (args))
688     + return true;
689     +
690     /* If any of the arguments are dependent expressions, we can't evaluate
691     the attribute until instantiation time. */
692     for (arg = args; arg; arg = TREE_CHAIN (arg))
693     --- a/gcc/cp/decl.c 2015-04-02 18:43:02.000000000 +0200
694     +++ b/gcc/cp/decl.c 2015-05-23 11:23:34.737303073 +0200
695     @@ -4825,8 +4825,11 @@
696    
697     was_public = TREE_PUBLIC (decl);
698    
699     - /* Enter this declaration into the symbol table. */
700     - decl = maybe_push_decl (decl);
701     + /* Enter this declaration into the symbol table. Don't push the plain
702     + VAR_DECL for a variable template. */
703     + if (!template_parm_scope_p ()
704     + || TREE_CODE (decl) != VAR_DECL)
705     + decl = maybe_push_decl (decl);
706    
707     if (processing_template_decl)
708     decl = push_template_decl (decl);
709     @@ -10628,7 +10631,7 @@
710     }
711     else if (decl_context == FIELD)
712     {
713     - if (!staticp && TREE_CODE (type) != METHOD_TYPE
714     + if (!staticp && !friendp && TREE_CODE (type) != METHOD_TYPE
715     && type_uses_auto (type))
716     {
717     error ("non-static data member declared %<auto%>");
718     --- a/gcc/cp/lambda.c 2015-04-03 19:23:27.000000000 +0200
719     +++ b/gcc/cp/lambda.c 2015-05-23 11:18:33.958634538 +0200
720     @@ -787,7 +787,7 @@
721     /* In a lambda, need to go through 'this' capture. */
722     tree lam = CLASSTYPE_LAMBDA_EXPR (current_class_type);
723     tree cap = lambda_expr_this_capture (lam, add_capture_p);
724     - if (cap != error_mark_node)
725     + if (cap && cap != error_mark_node)
726     object = build_x_indirect_ref (EXPR_LOCATION (object), cap,
727     RO_NULL, tf_warning_or_error);
728     }
729     --- a/gcc/cp/name-lookup.c 2015-04-01 23:27:55.000000000 +0200
730     +++ b/gcc/cp/name-lookup.c 2015-05-23 11:18:33.958634538 +0200
731     @@ -3408,7 +3408,7 @@
732     tf_warning_or_error);
733     if (b_kind < bk_proper_base)
734     {
735     - if (!bases_dependent_p)
736     + if (!bases_dependent_p || b_kind == bk_same_type)
737     {
738     error_not_base_type (scope, current_class_type);
739     return NULL_TREE;
740     --- a/gcc/cp/parser.c 2015-04-20 18:55:33.000000000 +0200
741     +++ b/gcc/cp/parser.c 2015-05-23 11:32:41.668037917 +0200
742     @@ -22500,6 +22500,13 @@
743     attributes = attribute;
744     }
745     token = cp_lexer_peek_token (parser->lexer);
746     + if (token->type == CPP_ELLIPSIS)
747     + {
748     + cp_lexer_consume_token (parser->lexer);
749     + TREE_VALUE (attribute)
750     + = make_pack_expansion (TREE_VALUE (attribute));
751     + token = cp_lexer_peek_token (parser->lexer);
752     + }
753     if (token->type != CPP_COMMA)
754     break;
755     cp_lexer_consume_token (parser->lexer);
756     @@ -22578,20 +22585,27 @@
757     return alignas_expr;
758     }
759    
760     + alignas_expr = cxx_alignas_expr (alignas_expr);
761     + alignas_expr = build_tree_list (NULL_TREE, alignas_expr);
762     +
763     + if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
764     + {
765     + cp_lexer_consume_token (parser->lexer);
766     + alignas_expr = make_pack_expansion (alignas_expr);
767     + }
768     +
769     if (cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN) == NULL)
770     {
771     cp_parser_error (parser, "expected %<)%>");
772     return error_mark_node;
773     }
774    
775     - alignas_expr = cxx_alignas_expr (alignas_expr);
776     -
777     /* Build the C++-11 representation of an 'aligned'
778     attribute. */
779     attributes =
780     build_tree_list (build_tree_list (get_identifier ("gnu"),
781     get_identifier ("aligned")),
782     - build_tree_list (NULL_TREE, alignas_expr));
783     + alignas_expr);
784     }
785    
786     return attributes;
787     @@ -30466,11 +30480,9 @@
788     else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
789     && OMP_CLAUSE_DECL (*c) == real_decl)
790     {
791     - /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES,
792     - change it to shared (decl) in OMP_PARALLEL_CLAUSES. */
793     - tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
794     - OMP_CLAUSE_DECL (l) = real_decl;
795     - CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
796     + /* Move lastprivate (decl) clause to OMP_FOR_CLAUSES. */
797     + tree l = *c;
798     + *c = OMP_CLAUSE_CHAIN (*c);
799     if (code == OMP_SIMD)
800     {
801     OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
802     @@ -30481,8 +30493,6 @@
803     OMP_CLAUSE_CHAIN (l) = clauses;
804     clauses = l;
805     }
806     - OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
807     - CP_OMP_CLAUSE_INFO (*c) = NULL;
808     add_private_clause = false;
809     }
810     else
811     @@ -31316,6 +31326,7 @@
812     TREE_TYPE (ret) = void_type_node;
813     OMP_TEAMS_CLAUSES (ret) = clauses;
814     OMP_TEAMS_BODY (ret) = body;
815     + OMP_TEAMS_COMBINED (ret) = 1;
816     return add_stmt (ret);
817     }
818     }
819     --- a/gcc/cp/pt.c 2015-04-01 23:27:55.000000000 +0200
820     +++ b/gcc/cp/pt.c 2015-05-23 11:27:30.146802454 +0200
821     @@ -1919,7 +1919,13 @@
822     ++header_count;
823    
824     if (variable_template_p (fns))
825     - templates = tree_cons (explicit_targs, fns, templates);
826     + {
827     + tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (fns));
828     + targs = coerce_template_parms (parms, explicit_targs, fns,
829     + tf_warning_or_error,
830     + /*req_all*/true, /*use_defarg*/true);
831     + templates = tree_cons (targs, fns, templates);
832     + }
833     else for (; fns; fns = OVL_NEXT (fns))
834     {
835     tree fn = OVL_CURRENT (fns);
836     @@ -3338,9 +3344,9 @@
837     if (!arg || arg == error_mark_node)
838     return arg;
839    
840     - if (TREE_CODE (arg) == TREE_LIST)
841     + if (TREE_CODE (arg) == TREE_LIST && TREE_PURPOSE (arg))
842     {
843     - /* The only time we will see a TREE_LIST here is for a base
844     + /* A TREE_LIST with a non-null TREE_PURPOSE is for a base
845     class initializer. In this case, the TREE_PURPOSE will be a
846     _TYPE node (representing the base class expansion we're
847     initializing) and the TREE_VALUE will be a TREE_LIST
848     @@ -9065,6 +9071,21 @@
849     = tree_cons (NULL_TREE, TREE_VALUE (TREE_VALUE (t)),
850     chain);
851     }
852     + else if (TREE_VALUE (t) && PACK_EXPANSION_P (TREE_VALUE (t)))
853     + {
854     + /* An attribute pack expansion. */
855     + tree purp = TREE_PURPOSE (t);
856     + tree pack = (tsubst_pack_expansion
857     + (TREE_VALUE (t), args, complain, in_decl));
858     + int len = TREE_VEC_LENGTH (pack);
859     + for (int i = 0; i < len; ++i)
860     + {
861     + tree elt = TREE_VEC_ELT (pack, i);
862     + *q = build_tree_list (purp, elt);
863     + q = &TREE_CHAIN (*q);
864     + }
865     + continue;
866     + }
867     else
868     TREE_VALUE (t)
869     = tsubst_expr (TREE_VALUE (t), args, complain, in_decl,
870     @@ -11302,6 +11323,11 @@
871     tmpl = DECL_TI_TEMPLATE (t);
872     gen_tmpl = most_general_template (tmpl);
873     argvec = tsubst (DECL_TI_ARGS (t), args, complain, in_decl);
874     + if (argvec != error_mark_node)
875     + argvec = (coerce_innermost_template_parms
876     + (DECL_TEMPLATE_PARMS (gen_tmpl),
877     + argvec, t, complain,
878     + /*all*/true, /*defarg*/true));
879     if (argvec == error_mark_node)
880     RETURN (error_mark_node);
881     hash = hash_tmpl_and_args (gen_tmpl, argvec);
882     @@ -14249,7 +14275,7 @@
883     tmp = tsubst_omp_clauses (OMP_TARGET_UPDATE_CLAUSES (t), false,
884     args, complain, in_decl);
885     t = copy_node (t);
886     - OMP_CLAUSES (t) = tmp;
887     + OMP_TARGET_UPDATE_CLAUSES (t) = tmp;
888     add_stmt (t);
889     break;
890    
891     --- a/gcc/cp/tree.c 2015-04-09 22:11:44.000000000 +0200
892     +++ b/gcc/cp/tree.c 2015-05-23 11:27:15.316578155 +0200
893     @@ -1207,6 +1207,7 @@
894     {
895     bool changed = false;
896     vec<tree,va_gc> *vec = make_tree_vector ();
897     + tree r = t;
898     for (; t; t = TREE_CHAIN (t))
899     {
900     gcc_assert (!TREE_PURPOSE (t));
901     @@ -1215,7 +1216,6 @@
902     changed = true;
903     vec_safe_push (vec, elt);
904     }
905     - tree r = t;
906     if (changed)
907     r = build_tree_list_vec (vec);
908     release_tree_vector (vec);
909     @@ -1350,7 +1350,7 @@
910     case DECLTYPE_TYPE:
911     result = strip_typedefs_expr (DECLTYPE_TYPE_EXPR (t));
912     if (result == DECLTYPE_TYPE_EXPR (t))
913     - return t;
914     + result = NULL_TREE;
915     else
916     result = (finish_decltype_type
917     (result,
918     @@ -1424,8 +1424,8 @@
919     && type2 == TRAIT_EXPR_TYPE2 (t))
920     return t;
921     r = copy_node (t);
922     - TRAIT_EXPR_TYPE1 (t) = type1;
923     - TRAIT_EXPR_TYPE2 (t) = type2;
924     + TRAIT_EXPR_TYPE1 (r) = type1;
925     + TRAIT_EXPR_TYPE2 (r) = type2;
926     return r;
927     }
928    
929     --- a/gcc/cp/typeck2.c 2015-01-23 17:30:00.000000000 +0100
930     +++ b/gcc/cp/typeck2.c 2015-05-23 11:24:32.144136275 +0200
931     @@ -957,9 +957,16 @@
932     }
933     }
934     else if (complain & tf_error)
935     - error_at (EXPR_LOC_OR_LOC (init, input_location),
936     - "narrowing conversion of %qE from %qT to %qT inside { }",
937     - init, ftype, type);
938     + {
939     + int savederrorcount = errorcount;
940     + global_dc->pedantic_errors = 1;
941     + pedwarn (EXPR_LOC_OR_LOC (init, input_location), OPT_Wnarrowing,
942     + "narrowing conversion of %qE from %qT to %qT "
943     + "inside { }", init, ftype, type);
944     + if (errorcount == savederrorcount)
945     + ok = true;
946     + global_dc->pedantic_errors = flag_pedantic_errors;
947     + }
948     }
949    
950     return cxx_dialect == cxx98 || ok;
951     @@ -1089,6 +1096,19 @@
952     || TREE_CODE (type) == UNION_TYPE
953     || TREE_CODE (type) == COMPLEX_TYPE);
954    
955     + /* "If T is a class type and the initializer list has a single
956     + element of type cv U, where U is T or a class derived from T,
957     + the object is initialized from that element." */
958     + if (cxx_dialect >= cxx11
959     + && BRACE_ENCLOSED_INITIALIZER_P (init)
960     + && CONSTRUCTOR_NELTS (init) == 1
961     + && (CLASS_TYPE_P (type) || VECTOR_TYPE_P (type)))
962     + {
963     + tree elt = CONSTRUCTOR_ELT (init, 0)->value;
964     + if (reference_related_p (type, TREE_TYPE (elt)))
965     + init = elt;
966     + }
967     +
968     if (BRACE_ENCLOSED_INITIALIZER_P (init)
969     && !TYPE_NON_AGGREGATE_CLASS (type))
970     return process_init_constructor (type, init, complain);
971     --- a/gcc/fortran/check.c 2015-03-02 19:56:51.000000000 +0100
972     +++ b/gcc/fortran/check.c 2015-05-23 11:29:30.690530828 +0200
973     @@ -6213,6 +6213,15 @@
974     bool
975     gfc_check_storage_size (gfc_expr *a, gfc_expr *kind)
976     {
977     +
978     + if (a->expr_type == EXPR_NULL)
979     + {
980     + gfc_error ("Intrinsic function NULL at %L cannot be an actual "
981     + "argument to STORAGE_SIZE, because it returns a "
982     + "disassociated pointer", &a->where);
983     + return false;
984     + }
985     +
986     if (a->ts.type == BT_ASSUMED)
987     {
988     gfc_error ("%qs argument of %qs intrinsic at %L shall not be TYPE(*)",
989     --- a/gcc/fortran/decl.c 2015-04-10 13:29:53.000000000 +0200
990     +++ b/gcc/fortran/decl.c 2015-05-23 11:30:42.240495466 +0200
991     @@ -1404,9 +1404,7 @@
992     }
993     else if (init->expr_type == EXPR_ARRAY)
994     {
995     - gfc_constructor *c;
996     - c = gfc_constructor_first (init->value.constructor);
997     - clen = c->expr->value.character.length;
998     + clen = mpz_get_si (init->ts.u.cl->length->value.integer);
999     sym->ts.u.cl->length
1000     = gfc_get_int_expr (gfc_default_integer_kind,
1001     NULL, clen);
1002     @@ -5594,7 +5592,7 @@
1003     "a contained subprogram");
1004     break;
1005     default:
1006     - gfc_internal_error ("gfc_match_entry(): Bad state");
1007     + gfc_error ("Unexpected ENTRY statement at %C");
1008     }
1009     return MATCH_ERROR;
1010     }
1011     @@ -6970,7 +6968,8 @@
1012     gfc_symbol *sym;
1013     match m;
1014    
1015     - if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
1016     + if (!gfc_current_ns->proc_name
1017     + || gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
1018     {
1019     gfc_error ("PROTECTED at %C only allowed in specification "
1020     "part of a module");
1021     @@ -8512,6 +8511,11 @@
1022     gfc_op2string (op));
1023     break;
1024    
1025     + case INTERFACE_NAMELESS:
1026     + gfc_error ("Malformed GENERIC statement at %C");
1027     + goto error;
1028     + break;
1029     +
1030     default:
1031     gcc_unreachable ();
1032     }
1033     --- a/gcc/fortran/expr.c 2015-02-06 19:15:01.000000000 +0100
1034     +++ b/gcc/fortran/expr.c 2015-05-23 11:30:07.135026771 +0200
1035     @@ -3118,19 +3118,22 @@
1036     bad_proc = true;
1037    
1038     /* (ii) The assignment is in the main program; or */
1039     - if (gfc_current_ns->proc_name->attr.is_main_program)
1040     + if (gfc_current_ns->proc_name
1041     + && gfc_current_ns->proc_name->attr.is_main_program)
1042     bad_proc = true;
1043    
1044     /* (iii) A module or internal procedure... */
1045     - if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
1046     - || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
1047     + if (gfc_current_ns->proc_name
1048     + && (gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
1049     + || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
1050     && gfc_current_ns->parent
1051     && (!(gfc_current_ns->parent->proc_name->attr.function
1052     || gfc_current_ns->parent->proc_name->attr.subroutine)
1053     || gfc_current_ns->parent->proc_name->attr.is_main_program))
1054     {
1055     /* ... that is not a function... */
1056     - if (!gfc_current_ns->proc_name->attr.function)
1057     + if (gfc_current_ns->proc_name
1058     + && !gfc_current_ns->proc_name->attr.function)
1059     bad_proc = true;
1060    
1061     /* ... or is not an entry and has a different name. */
1062     --- a/gcc/fortran/interface.c 2015-02-01 01:29:54.000000000 +0100
1063     +++ b/gcc/fortran/interface.c 2015-05-23 11:30:58.232706361 +0200
1064     @@ -346,8 +346,12 @@
1065     break;
1066    
1067     m = MATCH_ERROR;
1068     - gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, "
1069     - "but got %s", s1, s2);
1070     + if (strcmp(s2, "none") == 0)
1071     + gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> "
1072     + "at %C, ", s1);
1073     + else
1074     + gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, "
1075     + "but got %s", s1, s2);
1076     }
1077    
1078     }
1079     --- a/gcc/fortran/io.c 2015-02-01 01:29:54.000000000 +0100
1080     +++ b/gcc/fortran/io.c 2015-05-23 11:31:18.785975216 +0200
1081     @@ -385,7 +385,7 @@
1082    
1083     if (c == delim)
1084     {
1085     - c = next_char (INSTRING_NOWARN);
1086     + c = next_char (NONSTRING);
1087    
1088     if (c == '\0')
1089     {
1090     @@ -2382,9 +2382,7 @@
1091     if (m == MATCH_NO)
1092     {
1093     m = gfc_match_expr (&fp->unit);
1094     - if (m == MATCH_ERROR)
1095     - goto done;
1096     - if (m == MATCH_NO)
1097     + if (m == MATCH_ERROR || m == MATCH_NO)
1098     goto syntax;
1099     }
1100    
1101     --- a/gcc/fortran/match.c 2015-01-15 21:11:12.000000000 +0100
1102     +++ b/gcc/fortran/match.c 2015-05-23 11:30:58.232706361 +0200
1103     @@ -110,6 +110,9 @@
1104     case INTRINSIC_PARENTHESES:
1105     return "parens";
1106    
1107     + case INTRINSIC_NONE:
1108     + return "none";
1109     +
1110     default:
1111     break;
1112     }
1113     --- a/gcc/fortran/parse.c 2015-02-01 01:29:54.000000000 +0100
1114     +++ b/gcc/fortran/parse.c 2015-05-23 11:29:15.011314175 +0200
1115     @@ -2425,8 +2425,7 @@
1116     break;
1117    
1118     default:
1119     - gfc_internal_error ("Unexpected %s statement in verify_st_order() at %C",
1120     - gfc_ascii_statement (st));
1121     + return false;
1122     }
1123    
1124     /* All is well, record the statement in case we need it next time. */
1125     --- a/gcc/fortran/scanner.c 2015-02-13 17:57:28.000000000 +0100
1126     +++ b/gcc/fortran/scanner.c 2015-05-23 11:31:18.785975216 +0200
1127     @@ -1272,21 +1272,11 @@
1128     are still in a string and we are looking for a possible
1129     doubled quote and we end up here. See PR64506. */
1130    
1131     - if (in_string)
1132     + if (in_string && c != '\n')
1133     {
1134     gfc_current_locus = old_loc;
1135     -
1136     - if (c == '!')
1137     - {
1138     - skip_comment_line ();
1139     - goto restart;
1140     - }
1141     -
1142     - if (c != '\n')
1143     - {
1144     - c = '&';
1145     - goto done;
1146     - }
1147     + c = '&';
1148     + goto done;
1149     }
1150    
1151     if (c != '!' && c != '\n')
1152     @@ -1392,6 +1382,8 @@
1153     "Missing %<&%> in continued character "
1154     "constant at %C");
1155     }
1156     + else if (!in_string && (c == '\'' || c == '"'))
1157     + goto done;
1158     /* Both !$omp and !$ -fopenmp continuation lines have & on the
1159     continuation line only optionally. */
1160     else if (openmp_flag || openacc_flag || openmp_cond_flag)
1161     --- a/gcc/fortran/symbol.c 2015-04-10 13:29:53.000000000 +0200
1162     +++ b/gcc/fortran/symbol.c 2015-05-23 11:28:41.895849323 +0200
1163     @@ -458,6 +458,11 @@
1164     }
1165     }
1166    
1167     + if (attr->dummy && ((attr->function || attr->subroutine) &&
1168     + gfc_current_state () == COMP_CONTAINS))
1169     + gfc_error_now ("internal procedure '%s' at %L conflicts with "
1170     + "DUMMY argument", name, where);
1171     +
1172     conf (dummy, entry);
1173     conf (dummy, intrinsic);
1174     conf (dummy, threadprivate);
1175     --- a/gcc/fortran/trans-openmp.c 2015-03-30 19:54:05.000000000 +0200
1176     +++ b/gcc/fortran/trans-openmp.c 2015-05-23 11:32:41.669037929 +0200
1177     @@ -4114,6 +4114,7 @@
1178     stmtblock_t block;
1179     gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM];
1180     tree stmt, omp_clauses = NULL_TREE;
1181     + bool combined = true;
1182    
1183     gfc_start_block (&block);
1184     if (clausesa == NULL)
1185     @@ -4130,6 +4131,7 @@
1186     case EXEC_OMP_TARGET_TEAMS:
1187     case EXEC_OMP_TEAMS:
1188     stmt = gfc_trans_omp_code (code->block->next, true);
1189     + combined = false;
1190     break;
1191     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
1192     case EXEC_OMP_TEAMS_DISTRIBUTE:
1193     @@ -4143,6 +4145,8 @@
1194     }
1195     stmt = build2_loc (input_location, OMP_TEAMS, void_type_node, stmt,
1196     omp_clauses);
1197     + if (combined)
1198     + OMP_TEAMS_COMBINED (stmt) = 1;
1199     gfc_add_expr_to_block (&block, stmt);
1200     return gfc_finish_block (&block);
1201     }
1202     @@ -4163,9 +4167,14 @@
1203     if (code->op == EXEC_OMP_TARGET)
1204     stmt = gfc_trans_omp_code (code->block->next, true);
1205     else
1206     - stmt = gfc_trans_omp_teams (code, clausesa);
1207     - if (TREE_CODE (stmt) != BIND_EXPR)
1208     - stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
1209     + {
1210     + pushlevel ();
1211     + stmt = gfc_trans_omp_teams (code, clausesa);
1212     + if (TREE_CODE (stmt) != BIND_EXPR)
1213     + stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
1214     + else
1215     + poplevel (0, 0);
1216     + }
1217     if (flag_openmp)
1218     stmt = build2_loc (input_location, OMP_TARGET, void_type_node, stmt,
1219     omp_clauses);
1220     --- a/gcc/gimplify.c 2015-03-20 13:39:32.000000000 +0100
1221     +++ b/gcc/gimplify.c 2015-05-23 11:32:41.671037954 +0200
1222     @@ -111,6 +111,9 @@
1223     /* Flag for GOVD_MAP: don't copy back. */
1224     GOVD_MAP_TO_ONLY = 8192,
1225    
1226     + /* Flag for GOVD_LINEAR or GOVD_LASTPRIVATE: no outer reference. */
1227     + GOVD_LINEAR_LASTPRIVATE_NO_OUTER = 16384,
1228     +
1229     GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
1230     | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR
1231     | GOVD_LOCAL)
1232     @@ -126,6 +129,7 @@
1233     ORT_TASK = 4,
1234     ORT_UNTIED_TASK = 5,
1235     ORT_TEAMS = 8,
1236     + ORT_COMBINED_TEAMS = 9,
1237     /* Data region. */
1238     ORT_TARGET_DATA = 16,
1239     /* Data region with offloading. */
1240     @@ -5842,7 +5846,7 @@
1241     DECL_NAME (lang_hooks.decls.omp_report_decl (decl)));
1242     error_at (ctx->location, "enclosing task");
1243     }
1244     - else if (ctx->region_type == ORT_TEAMS)
1245     + else if (ctx->region_type & ORT_TEAMS)
1246     {
1247     error ("%qE not specified in enclosing teams construct",
1248     DECL_NAME (lang_hooks.decls.omp_report_decl (decl)));
1249     @@ -5935,6 +5939,13 @@
1250     need to propagate anything to an outer context. */
1251     if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
1252     return ret;
1253     + if ((flags & (GOVD_LINEAR | GOVD_LINEAR_LASTPRIVATE_NO_OUTER))
1254     + == (GOVD_LINEAR | GOVD_LINEAR_LASTPRIVATE_NO_OUTER))
1255     + return ret;
1256     + if ((flags & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
1257     + | GOVD_LINEAR_LASTPRIVATE_NO_OUTER))
1258     + == (GOVD_LASTPRIVATE | GOVD_LINEAR_LASTPRIVATE_NO_OUTER))
1259     + return ret;
1260     if (ctx->outer_context
1261     && omp_notice_variable (ctx->outer_context, decl, in_code))
1262     return true;
1263     @@ -6034,6 +6045,36 @@
1264     return false;
1265     }
1266    
1267     +/* Return true if the CTX is combined with distribute and thus
1268     + lastprivate can't be supported. */
1269     +
1270     +static bool
1271     +omp_no_lastprivate (struct gimplify_omp_ctx *ctx)
1272     +{
1273     + do
1274     + {
1275     + if (ctx->outer_context == NULL)
1276     + return false;
1277     + ctx = ctx->outer_context;
1278     + switch (ctx->region_type)
1279     + {
1280     + case ORT_WORKSHARE:
1281     + if (!ctx->combined_loop)
1282     + return false;
1283     + if (ctx->distribute)
1284     + return true;
1285     + break;
1286     + case ORT_COMBINED_PARALLEL:
1287     + break;
1288     + case ORT_COMBINED_TEAMS:
1289     + return true;
1290     + default:
1291     + return false;
1292     + }
1293     + }
1294     + while (1);
1295     +}
1296     +
1297     /* Scan the OMP clauses in *LIST_P, installing mappings into a new
1298     and previous omp contexts. */
1299    
1300     @@ -6077,6 +6118,35 @@
1301     case OMP_CLAUSE_LASTPRIVATE:
1302     flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
1303     check_non_private = "lastprivate";
1304     + decl = OMP_CLAUSE_DECL (c);
1305     + if (omp_no_lastprivate (ctx))
1306     + {
1307     + notice_outer = false;
1308     + flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
1309     + }
1310     + else if (error_operand_p (decl))
1311     + goto do_add;
1312     + else if (outer_ctx
1313     + && outer_ctx->region_type == ORT_COMBINED_PARALLEL
1314     + && splay_tree_lookup (outer_ctx->variables,
1315     + (splay_tree_key) decl) == NULL)
1316     + omp_add_variable (outer_ctx, decl, GOVD_SHARED | GOVD_SEEN);
1317     + else if (outer_ctx
1318     + && outer_ctx->region_type == ORT_WORKSHARE
1319     + && outer_ctx->combined_loop
1320     + && splay_tree_lookup (outer_ctx->variables,
1321     + (splay_tree_key) decl) == NULL
1322     + && !omp_check_private (outer_ctx, decl, false))
1323     + {
1324     + omp_add_variable (outer_ctx, decl, GOVD_LASTPRIVATE | GOVD_SEEN);
1325     + if (outer_ctx->outer_context
1326     + && (outer_ctx->outer_context->region_type
1327     + == ORT_COMBINED_PARALLEL)
1328     + && splay_tree_lookup (outer_ctx->outer_context->variables,
1329     + (splay_tree_key) decl) == NULL)
1330     + omp_add_variable (outer_ctx->outer_context, decl,
1331     + GOVD_SHARED | GOVD_SEEN);
1332     + }
1333     goto do_add;
1334     case OMP_CLAUSE_REDUCTION:
1335     flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
1336     @@ -6089,7 +6159,68 @@
1337     remove = true;
1338     break;
1339     }
1340     + else
1341     + {
1342     + /* For combined #pragma omp parallel for simd, need to put
1343     + lastprivate and perhaps firstprivate too on the
1344     + parallel. Similarly for #pragma omp for simd. */
1345     + struct gimplify_omp_ctx *octx = outer_ctx;
1346     + decl = NULL_TREE;
1347     + if (omp_no_lastprivate (ctx))
1348     + OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
1349     + do
1350     + {
1351     + if (OMP_CLAUSE_LINEAR_NO_COPYIN (c)
1352     + && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
1353     + break;
1354     + decl = OMP_CLAUSE_DECL (c);
1355     + if (error_operand_p (decl))
1356     + {
1357     + decl = NULL_TREE;
1358     + break;
1359     + }
1360     + if (octx
1361     + && octx->region_type == ORT_WORKSHARE
1362     + && octx->combined_loop)
1363     + {
1364     + if (octx->outer_context
1365     + && (octx->outer_context->region_type
1366     + == ORT_COMBINED_PARALLEL
1367     + || (octx->outer_context->region_type
1368     + == ORT_COMBINED_TEAMS)))
1369     + octx = octx->outer_context;
1370     + else if (omp_check_private (octx, decl, false))
1371     + break;
1372     + }
1373     + else
1374     + break;
1375     + gcc_checking_assert (splay_tree_lookup (octx->variables,
1376     + (splay_tree_key)
1377     + decl) == NULL);
1378     + flags = GOVD_SEEN;
1379     + if (!OMP_CLAUSE_LINEAR_NO_COPYIN (c))
1380     + flags |= GOVD_FIRSTPRIVATE;
1381     + if (!OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
1382     + flags |= GOVD_LASTPRIVATE;
1383     + omp_add_variable (octx, decl, flags);
1384     + if (octx->outer_context == NULL)
1385     + break;
1386     + octx = octx->outer_context;
1387     + }
1388     + while (1);
1389     + if (octx
1390     + && decl
1391     + && (!OMP_CLAUSE_LINEAR_NO_COPYIN (c)
1392     + || !OMP_CLAUSE_LINEAR_NO_COPYOUT (c)))
1393     + omp_notice_variable (octx, decl, true);
1394     + }
1395     flags = GOVD_LINEAR | GOVD_EXPLICIT;
1396     + if (OMP_CLAUSE_LINEAR_NO_COPYIN (c)
1397     + && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
1398     + {
1399     + notice_outer = false;
1400     + flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
1401     + }
1402     goto do_add;
1403    
1404     case OMP_CLAUSE_MAP:
1405     @@ -6543,34 +6674,6 @@
1406     OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
1407     OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
1408     }
1409     - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
1410     - && ctx->outer_context
1411     - && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c)
1412     - && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)))
1413     - {
1414     - if (ctx->outer_context->combined_loop
1415     - && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
1416     - {
1417     - n = splay_tree_lookup (ctx->outer_context->variables,
1418     - (splay_tree_key) decl);
1419     - if (n == NULL
1420     - || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
1421     - {
1422     - int flags = GOVD_FIRSTPRIVATE;
1423     - /* #pragma omp distribute does not allow
1424     - lastprivate clause. */
1425     - if (!ctx->outer_context->distribute)
1426     - flags |= GOVD_LASTPRIVATE;
1427     - if (n == NULL)
1428     - omp_add_variable (ctx->outer_context, decl,
1429     - flags | GOVD_SEEN);
1430     - else
1431     - n->value |= flags | GOVD_SEEN;
1432     - }
1433     - }
1434     - else if (!is_global_var (decl))
1435     - omp_notice_variable (ctx->outer_context, decl, true);
1436     - }
1437     }
1438     break;
1439    
1440     @@ -6581,6 +6684,13 @@
1441     n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
1442     OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
1443     = (n->value & GOVD_FIRSTPRIVATE) != 0;
1444     + if (omp_no_lastprivate (ctx))
1445     + {
1446     + if (OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c))
1447     + remove = true;
1448     + else
1449     + OMP_CLAUSE_CODE (c) = OMP_CLAUSE_PRIVATE;
1450     + }
1451     break;
1452    
1453     case OMP_CLAUSE_ALIGNED:
1454     @@ -6895,6 +7005,22 @@
1455     gcc_unreachable ();
1456     }
1457    
1458     + /* Set OMP_CLAUSE_LINEAR_NO_COPYIN flag on explicit linear
1459     + clause for the IV. */
1460     + if (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1)
1461     + {
1462     + t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), 0);
1463     + gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
1464     + decl = TREE_OPERAND (t, 0);
1465     + for (tree c = OMP_FOR_CLAUSES (for_stmt); c; c = OMP_CLAUSE_CHAIN (c))
1466     + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
1467     + && OMP_CLAUSE_DECL (c) == decl)
1468     + {
1469     + OMP_CLAUSE_LINEAR_NO_COPYIN (c) = 1;
1470     + break;
1471     + }
1472     + }
1473     +
1474     gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
1475     simd ? ORT_SIMD : ORT_WORKSHARE);
1476     if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE)
1477     @@ -6969,38 +7095,67 @@
1478     {
1479     c = build_omp_clause (input_location, OMP_CLAUSE_LINEAR);
1480     OMP_CLAUSE_LINEAR_NO_COPYIN (c) = 1;
1481     - if (has_decl_expr
1482     - && bitmap_bit_p (has_decl_expr, DECL_UID (decl)))
1483     - OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
1484     + unsigned int flags = GOVD_LINEAR | GOVD_EXPLICIT | GOVD_SEEN;
1485     + if ((has_decl_expr
1486     + && bitmap_bit_p (has_decl_expr, DECL_UID (decl)))
1487     + || omp_no_lastprivate (gimplify_omp_ctxp))
1488     + {
1489     + OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
1490     + flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
1491     + }
1492     OMP_CLAUSE_DECL (c) = decl;
1493     OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt);
1494     OMP_FOR_CLAUSES (for_stmt) = c;
1495     - omp_add_variable (gimplify_omp_ctxp, decl,
1496     - GOVD_LINEAR | GOVD_EXPLICIT | GOVD_SEEN);
1497     +
1498     + omp_add_variable (gimplify_omp_ctxp, decl, flags);
1499     + struct gimplify_omp_ctx *outer
1500     + = gimplify_omp_ctxp->outer_context;
1501     + if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
1502     + {
1503     + if (outer->region_type == ORT_WORKSHARE
1504     + && outer->combined_loop)
1505     + {
1506     + if (outer->outer_context
1507     + && (outer->outer_context->region_type
1508     + == ORT_COMBINED_PARALLEL))
1509     + outer = outer->outer_context;
1510     + else if (omp_check_private (outer, decl, false))
1511     + outer = NULL;
1512     + }
1513     + else if (outer->region_type != ORT_COMBINED_PARALLEL)
1514     + outer = NULL;
1515     + if (outer)
1516     + {
1517     + omp_add_variable (outer, decl,
1518     + GOVD_LASTPRIVATE | GOVD_SEEN);
1519     + if (outer->outer_context)
1520     + omp_notice_variable (outer->outer_context, decl, true);
1521     + }
1522     + }
1523     }
1524     else
1525     {
1526     bool lastprivate
1527     = (!has_decl_expr
1528     - || !bitmap_bit_p (has_decl_expr, DECL_UID (decl)));
1529     - if (lastprivate
1530     - && gimplify_omp_ctxp->outer_context
1531     - && gimplify_omp_ctxp->outer_context->region_type
1532     - == ORT_WORKSHARE
1533     - && gimplify_omp_ctxp->outer_context->combined_loop
1534     - && !gimplify_omp_ctxp->outer_context->distribute)
1535     + || !bitmap_bit_p (has_decl_expr, DECL_UID (decl)))
1536     + && !omp_no_lastprivate (gimplify_omp_ctxp);
1537     + struct gimplify_omp_ctx *outer
1538     + = gimplify_omp_ctxp->outer_context;
1539     + if (outer && lastprivate)
1540     {
1541     - struct gimplify_omp_ctx *outer
1542     - = gimplify_omp_ctxp->outer_context;
1543     - n = splay_tree_lookup (outer->variables,
1544     - (splay_tree_key) decl);
1545     - if (n != NULL
1546     - && (n->value & GOVD_DATA_SHARE_CLASS) == GOVD_LOCAL)
1547     - lastprivate = false;
1548     - else if (omp_check_private (outer, decl, false))
1549     - error ("lastprivate variable %qE is private in outer "
1550     - "context", DECL_NAME (decl));
1551     - else
1552     + if (outer->region_type == ORT_WORKSHARE
1553     + && outer->combined_loop)
1554     + {
1555     + if (outer->outer_context
1556     + && (outer->outer_context->region_type
1557     + == ORT_COMBINED_PARALLEL))
1558     + outer = outer->outer_context;
1559     + else if (omp_check_private (outer, decl, false))
1560     + outer = NULL;
1561     + }
1562     + else if (outer->region_type != ORT_COMBINED_PARALLEL)
1563     + outer = NULL;
1564     + if (outer)
1565     {
1566     omp_add_variable (outer, decl,
1567     GOVD_LASTPRIVATE | GOVD_SEEN);
1568     @@ -7008,6 +7163,7 @@
1569     omp_notice_variable (outer->outer_context, decl, true);
1570     }
1571     }
1572     +
1573     c = build_omp_clause (input_location,
1574     lastprivate ? OMP_CLAUSE_LASTPRIVATE
1575     : OMP_CLAUSE_PRIVATE);
1576     @@ -7299,7 +7455,7 @@
1577     ort = ORT_TARGET_DATA;
1578     break;
1579     case OMP_TEAMS:
1580     - ort = ORT_TEAMS;
1581     + ort = OMP_TEAMS_COMBINED (expr) ? ORT_COMBINED_TEAMS : ORT_TEAMS;
1582     break;
1583     default:
1584     gcc_unreachable ();
1585     --- a/gcc/ipa-chkp.c 2015-04-06 12:41:55.000000000 +0200
1586     +++ b/gcc/ipa-chkp.c 2015-05-23 11:31:36.800208969 +0200
1587     @@ -264,7 +264,7 @@
1588     if (!arg_type)
1589     return orig_type;
1590    
1591     - type = copy_node (orig_type);
1592     + type = build_distinct_type_copy (orig_type);
1593     TYPE_ARG_TYPES (type) = copy_list (TYPE_ARG_TYPES (type));
1594    
1595     for (arg_type = TYPE_ARG_TYPES (type);
1596     --- a/gcc/ipa-inline.c 2015-04-03 20:09:13.000000000 +0200
1597     +++ b/gcc/ipa-inline.c 2015-05-23 11:26:42.303067491 +0200
1598     @@ -427,49 +427,55 @@
1599     && lookup_attribute ("always_inline",
1600     DECL_ATTRIBUTES (callee->decl)));
1601    
1602     + /* Until GCC 4.9 we did not check the semantics alterning flags
1603     + bellow and inline across optimization boundry.
1604     + Enabling checks bellow breaks several packages by refusing
1605     + to inline library always_inline functions. See PR65873.
1606     + Disable the check for early inlining for now until better solution
1607     + is found. */
1608     + if (always_inline && early)
1609     + ;
1610     /* There are some options that change IL semantics which means
1611     we cannot inline in these cases for correctness reason.
1612     Not even for always_inline declared functions. */
1613     /* Strictly speaking only when the callee contains signed integer
1614     math where overflow is undefined. */
1615     - if ((check_maybe_up (flag_strict_overflow)
1616     - /* this flag is set by optimize. Allow inlining across
1617     - optimize boundary. */
1618     - && (!opt_for_fn (caller->decl, optimize)
1619     - == !opt_for_fn (callee->decl, optimize) || !always_inline))
1620     - || check_match (flag_wrapv)
1621     - || check_match (flag_trapv)
1622     - /* Strictly speaking only when the callee contains memory
1623     - accesses that are not using alias-set zero anyway. */
1624     - || check_maybe_down (flag_strict_aliasing)
1625     - /* Strictly speaking only when the callee uses FP math. */
1626     - || check_maybe_up (flag_rounding_math)
1627     - || check_maybe_up (flag_trapping_math)
1628     - || check_maybe_down (flag_unsafe_math_optimizations)
1629     - || check_maybe_down (flag_finite_math_only)
1630     - || check_maybe_up (flag_signaling_nans)
1631     - || check_maybe_down (flag_cx_limited_range)
1632     - || check_maybe_up (flag_signed_zeros)
1633     - || check_maybe_down (flag_associative_math)
1634     - || check_maybe_down (flag_reciprocal_math)
1635     - /* We do not want to make code compiled with exceptions to be brought
1636     - into a non-EH function unless we know that the callee does not
1637     - throw. This is tracked by DECL_FUNCTION_PERSONALITY. */
1638     - || (check_match (flag_non_call_exceptions)
1639     - /* TODO: We also may allow bringing !flag_non_call_exceptions
1640     - to flag_non_call_exceptions function, but that may need
1641     - extra work in tree-inline to add the extra EH edges. */
1642     - && (!opt_for_fn (callee->decl, flag_non_call_exceptions)
1643     - || DECL_FUNCTION_PERSONALITY (callee->decl)))
1644     - || (check_maybe_up (flag_exceptions)
1645     - && DECL_FUNCTION_PERSONALITY (callee->decl))
1646     - /* Strictly speaking only when the callee contains function
1647     - calls that may end up setting errno. */
1648     - || check_maybe_up (flag_errno_math)
1649     - /* When devirtualization is diabled for callee, it is not safe
1650     - to inline it as we possibly mangled the type info.
1651     - Allow early inlining of always inlines. */
1652     - || (!early && check_maybe_down (flag_devirtualize)))
1653     + else if ((check_maybe_up (flag_strict_overflow)
1654     + /* this flag is set by optimize. Allow inlining across
1655     + optimize boundary. */
1656     + && (!opt_for_fn (caller->decl, optimize)
1657     + == !opt_for_fn (callee->decl, optimize) || !always_inline))
1658     + || check_match (flag_wrapv)
1659     + || check_match (flag_trapv)
1660     + /* Strictly speaking only when the callee uses FP math. */
1661     + || check_maybe_up (flag_rounding_math)
1662     + || check_maybe_up (flag_trapping_math)
1663     + || check_maybe_down (flag_unsafe_math_optimizations)
1664     + || check_maybe_down (flag_finite_math_only)
1665     + || check_maybe_up (flag_signaling_nans)
1666     + || check_maybe_down (flag_cx_limited_range)
1667     + || check_maybe_up (flag_signed_zeros)
1668     + || check_maybe_down (flag_associative_math)
1669     + || check_maybe_down (flag_reciprocal_math)
1670     + /* We do not want to make code compiled with exceptions to be
1671     + brought into a non-EH function unless we know that the callee
1672     + does not throw.
1673     + This is tracked by DECL_FUNCTION_PERSONALITY. */
1674     + || (check_match (flag_non_call_exceptions)
1675     + /* TODO: We also may allow bringing !flag_non_call_exceptions
1676     + to flag_non_call_exceptions function, but that may need
1677     + extra work in tree-inline to add the extra EH edges. */
1678     + && (!opt_for_fn (callee->decl, flag_non_call_exceptions)
1679     + || DECL_FUNCTION_PERSONALITY (callee->decl)))
1680     + || (check_maybe_up (flag_exceptions)
1681     + && DECL_FUNCTION_PERSONALITY (callee->decl))
1682     + /* Strictly speaking only when the callee contains function
1683     + calls that may end up setting errno. */
1684     + || check_maybe_up (flag_errno_math)
1685     + /* When devirtualization is diabled for callee, it is not safe
1686     + to inline it as we possibly mangled the type info.
1687     + Allow early inlining of always inlines. */
1688     + || (!early && check_maybe_down (flag_devirtualize)))
1689     {
1690     e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
1691     inlinable = false;
1692     @@ -484,6 +490,17 @@
1693     e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
1694     inlinable = false;
1695     }
1696     + /* If explicit optimize attribute are not used, the mismatch is caused
1697     + by different command line options used to build different units.
1698     + Do not care about COMDAT functions - those are intended to be
1699     + optimized with the optimization flags of module they are used in.
1700     + Also do not care about mixing up size/speed optimization when
1701     + DECL_DISREGARD_INLINE_LIMITS is set. */
1702     + else if ((callee->merged
1703     + && !lookup_attribute ("optimize",
1704     + DECL_ATTRIBUTES (caller->decl)))
1705     + || DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1706     + ;
1707     /* If mismatch is caused by merging two LTO units with different
1708     optimizationflags we want to be bit nicer. However never inline
1709     if one of functions is not optimized at all. */
1710     @@ -515,7 +532,7 @@
1711     else if (opt_for_fn (callee->decl, optimize_size)
1712     < opt_for_fn (caller->decl, optimize_size)
1713     || (opt_for_fn (callee->decl, optimize)
1714     - >= opt_for_fn (caller->decl, optimize)))
1715     + > opt_for_fn (caller->decl, optimize)))
1716     {
1717     if (estimate_edge_time (e)
1718     >= 20 + inline_edge_summary (e)->call_stmt_time)
1719     --- a/gcc/lra-constraints.c 2015-04-10 18:05:26.000000000 +0200
1720     +++ b/gcc/lra-constraints.c 2015-05-23 11:18:33.964634884 +0200
1721     @@ -533,7 +533,7 @@
1722     if (x == res || CONSTANT_P (res))
1723     return res;
1724     return lra_eliminate_regs_1 (insn, res, GET_MODE (res),
1725     - 0, false, false, true);
1726     + false, false, 0, true);
1727     }
1728    
1729     /* Set up curr_operand_mode. */
1730     --- a/gcc/lra-eliminations.c 2015-02-04 21:02:21.000000000 +0100
1731     +++ b/gcc/lra-eliminations.c 2015-05-23 11:18:33.965634942 +0200
1732     @@ -318,7 +318,9 @@
1733     substitution if UPDATE_P, or the full offset if FULL_P, or
1734     otherwise zero. If FULL_P, we also use the SP offsets for
1735     elimination to SP. If UPDATE_P, use UPDATE_SP_OFFSET for updating
1736     - offsets of register elimnable to SP.
1737     + offsets of register elimnable to SP. If UPDATE_SP_OFFSET is
1738     + non-zero, don't use difference of the offset and the previous
1739     + offset.
1740    
1741     MEM_MODE is the mode of an enclosing MEM. We need this to know how
1742     much to adjust a register for, e.g., PRE_DEC. Also, if we are
1743     @@ -341,7 +343,8 @@
1744     const char *fmt;
1745     int copied = 0;
1746    
1747     - gcc_assert (!update_p || !full_p);
1748     + lra_assert (!update_p || !full_p);
1749     + lra_assert (update_sp_offset == 0 || (!subst_p && update_p && !full_p));
1750     if (! current_function_decl)
1751     return x;
1752    
1753     @@ -366,11 +369,14 @@
1754     {
1755     rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
1756    
1757     - if (update_p)
1758     - return plus_constant (Pmode, to,
1759     - ep->offset - ep->previous_offset
1760     - + (ep->to_rtx == stack_pointer_rtx
1761     - ? update_sp_offset : 0));
1762     + if (update_sp_offset != 0)
1763     + {
1764     + if (ep->to_rtx == stack_pointer_rtx)
1765     + return plus_constant (Pmode, to, update_sp_offset);
1766     + return to;
1767     + }
1768     + else if (update_p)
1769     + return plus_constant (Pmode, to, ep->offset - ep->previous_offset);
1770     else if (full_p)
1771     return plus_constant (Pmode, to,
1772     ep->offset
1773     @@ -395,16 +401,15 @@
1774    
1775     if (! update_p && ! full_p)
1776     return gen_rtx_PLUS (Pmode, to, XEXP (x, 1));
1777     -
1778     - offset = (update_p
1779     - ? ep->offset - ep->previous_offset
1780     - + (ep->to_rtx == stack_pointer_rtx
1781     - ? update_sp_offset : 0)
1782     - : ep->offset);
1783     +
1784     + if (update_sp_offset != 0)
1785     + offset = ep->to_rtx == stack_pointer_rtx ? update_sp_offset : 0;
1786     + else
1787     + offset = (update_p
1788     + ? ep->offset - ep->previous_offset : ep->offset);
1789     if (full_p && insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
1790     offset -= lra_get_insn_recog_data (insn)->sp_offset;
1791     - if (CONST_INT_P (XEXP (x, 1))
1792     - && INTVAL (XEXP (x, 1)) == -offset)
1793     + if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) == -offset)
1794     return to;
1795     else
1796     return gen_rtx_PLUS (Pmode, to,
1797     @@ -451,12 +456,18 @@
1798     {
1799     rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
1800    
1801     - if (update_p)
1802     + if (update_sp_offset != 0)
1803     + {
1804     + if (ep->to_rtx == stack_pointer_rtx)
1805     + return plus_constant (Pmode,
1806     + gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
1807     + update_sp_offset * INTVAL (XEXP (x, 1)));
1808     + return gen_rtx_MULT (Pmode, to, XEXP (x, 1));
1809     + }
1810     + else if (update_p)
1811     return plus_constant (Pmode,
1812     gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
1813     - (ep->offset - ep->previous_offset
1814     - + (ep->to_rtx == stack_pointer_rtx
1815     - ? update_sp_offset : 0))
1816     + (ep->offset - ep->previous_offset)
1817     * INTVAL (XEXP (x, 1)));
1818     else if (full_p)
1819     {
1820     @@ -889,11 +900,12 @@
1821    
1822     If REPLACE_P is false, just update the offsets while keeping the
1823     base register the same. If FIRST_P, use the sp offset for
1824     - elimination to sp. Otherwise, use UPDATE_SP_OFFSET for this.
1825     - Attach the note about used elimination for insns setting frame
1826     - pointer to update elimination easy (without parsing already
1827     - generated elimination insns to find offset previously used) in
1828     - future. */
1829     + elimination to sp. Otherwise, use UPDATE_SP_OFFSET for this. If
1830     + UPDATE_SP_OFFSET is non-zero, don't use difference of the offset
1831     + and the previous offset. Attach the note about used elimination
1832     + for insns setting frame pointer to update elimination easy (without
1833     + parsing already generated elimination insns to find offset
1834     + previously used) in future. */
1835    
1836     void
1837     eliminate_regs_in_insn (rtx_insn *insn, bool replace_p, bool first_p,
1838     @@ -940,6 +952,10 @@
1839     rtx src = SET_SRC (old_set);
1840     rtx off = remove_reg_equal_offset_note (insn, ep->to_rtx);
1841    
1842     + /* We should never process such insn with non-zero
1843     + UPDATE_SP_OFFSET. */
1844     + lra_assert (update_sp_offset == 0);
1845     +
1846     if (off != NULL_RTX
1847     || src == ep->to_rtx
1848     || (GET_CODE (src) == PLUS
1849     @@ -1026,7 +1042,8 @@
1850    
1851     if (! replace_p)
1852     {
1853     - offset += (ep->offset - ep->previous_offset);
1854     + if (update_sp_offset == 0)
1855     + offset += (ep->offset - ep->previous_offset);
1856     if (ep->to_rtx == stack_pointer_rtx)
1857     {
1858     if (first_p)
1859     --- a/gcc/lra-spills.c 2015-01-15 14:28:42.000000000 +0100
1860     +++ b/gcc/lra-spills.c 2015-05-23 11:18:33.965634942 +0200
1861     @@ -461,7 +461,7 @@
1862     {
1863     rtx x = lra_eliminate_regs_1 (insn, pseudo_slots[i].mem,
1864     GET_MODE (pseudo_slots[i].mem),
1865     - 0, false, false, true);
1866     + false, false, 0, true);
1867     *loc = x != pseudo_slots[i].mem ? x : copy_rtx (x);
1868     }
1869     return;
1870     --- a/gcc/lto-wrapper.c 2015-01-30 17:15:00.000000000 +0100
1871     +++ b/gcc/lto-wrapper.c 2015-05-23 11:21:27.938957086 +0200
1872     @@ -934,7 +934,7 @@
1873     filename[p - argv[i]] = '\0';
1874     file_offset = (off_t) loffset;
1875     }
1876     - fd = open (argv[i], O_RDONLY);
1877     + fd = open (filename, O_RDONLY | O_BINARY);
1878     if (fd == -1)
1879     {
1880     lto_argv[lto_argc++] = argv[i];
1881     --- a/gcc/match.pd 2015-02-13 21:17:55.000000000 +0100
1882     +++ b/gcc/match.pd 2015-05-23 11:33:11.742416376 +0200
1883     @@ -702,16 +702,12 @@
1884     (for integers). Avoid this if the final type is a pointer since
1885     then we sometimes need the middle conversion. Likewise if the
1886     final type has a precision not equal to the size of its mode. */
1887     - (if (((inter_int && inside_int)
1888     - || (inter_float && inside_float)
1889     - || (inter_vec && inside_vec))
1890     + (if (((inter_int && inside_int) || (inter_float && inside_float))
1891     + && (final_int || final_float)
1892     && inter_prec >= inside_prec
1893     - && (inter_float || inter_vec
1894     - || inter_unsignedp == inside_unsignedp)
1895     - && ! (final_prec != GET_MODE_PRECISION (element_mode (type))
1896     - && element_mode (type) == element_mode (inter_type))
1897     - && ! final_ptr
1898     - && (! final_vec || inter_prec == inside_prec))
1899     + && (inter_float || inter_unsignedp == inside_unsignedp)
1900     + && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type))
1901     + && TYPE_MODE (type) == TYPE_MODE (inter_type)))
1902     (ocvt @0))
1903    
1904     /* If we have a sign-extension of a zero-extended value, we can
1905     --- a/gcc/omp-low.c 2015-04-03 15:35:49.000000000 +0200
1906     +++ b/gcc/omp-low.c 2015-05-23 11:32:41.672037967 +0200
1907     @@ -5377,7 +5377,10 @@
1908     child_cfun = DECL_STRUCT_FUNCTION (child_fn);
1909    
1910     entry_bb = region->entry;
1911     - exit_bb = region->exit;
1912     + if (gimple_code (entry_stmt) == GIMPLE_OMP_TASK)
1913     + exit_bb = region->cont;
1914     + else
1915     + exit_bb = region->exit;
1916    
1917     bool is_cilk_for
1918     = (flag_cilkplus
1919     @@ -5436,7 +5439,9 @@
1920     variable. In which case, we need to keep the assignment. */
1921     if (gimple_omp_taskreg_data_arg (entry_stmt))
1922     {
1923     - basic_block entry_succ_bb = single_succ (entry_bb);
1924     + basic_block entry_succ_bb
1925     + = single_succ_p (entry_bb) ? single_succ (entry_bb)
1926     + : FALLTHRU_EDGE (entry_bb)->dest;
1927     tree arg, narg;
1928     gimple parcopy_stmt = NULL;
1929    
1930     @@ -5524,14 +5529,28 @@
1931     e = split_block (entry_bb, stmt);
1932     gsi_remove (&gsi, true);
1933     entry_bb = e->dest;
1934     - single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU;
1935     + edge e2 = NULL;
1936     + if (gimple_code (entry_stmt) == GIMPLE_OMP_PARALLEL)
1937     + single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU;
1938     + else
1939     + {
1940     + e2 = make_edge (e->src, BRANCH_EDGE (entry_bb)->dest, EDGE_ABNORMAL);
1941     + gcc_assert (e2->dest == region->exit);
1942     + remove_edge (BRANCH_EDGE (entry_bb));
1943     + set_immediate_dominator (CDI_DOMINATORS, e2->dest, e->src);
1944     + gsi = gsi_last_bb (region->exit);
1945     + gcc_assert (!gsi_end_p (gsi)
1946     + && gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN);
1947     + gsi_remove (&gsi, true);
1948     + }
1949    
1950     - /* Convert GIMPLE_OMP_RETURN into a RETURN_EXPR. */
1951     + /* Convert GIMPLE_OMP_{RETURN,CONTINUE} into a RETURN_EXPR. */
1952     if (exit_bb)
1953     {
1954     gsi = gsi_last_bb (exit_bb);
1955     gcc_assert (!gsi_end_p (gsi)
1956     - && gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN);
1957     + && (gimple_code (gsi_stmt (gsi))
1958     + == (e2 ? GIMPLE_OMP_CONTINUE : GIMPLE_OMP_RETURN)));
1959     stmt = gimple_build_return (NULL);
1960     gsi_insert_after (&gsi, stmt, GSI_SAME_STMT);
1961     gsi_remove (&gsi, true);
1962     @@ -5552,6 +5571,14 @@
1963     new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb, block);
1964     if (exit_bb)
1965     single_succ_edge (new_bb)->flags = EDGE_FALLTHRU;
1966     + if (e2)
1967     + {
1968     + basic_block dest_bb = e2->dest;
1969     + if (!exit_bb)
1970     + make_edge (new_bb, dest_bb, EDGE_FALLTHRU);
1971     + remove_edge (e2);
1972     + set_immediate_dominator (CDI_DOMINATORS, dest_bb, new_bb);
1973     + }
1974     /* When the OMP expansion process cannot guarantee an up-to-date
1975     loop tree arrange for the child function to fixup loops. */
1976     if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
1977     @@ -10511,7 +10538,21 @@
1978     cond_code = EQ_EXPR;
1979     }
1980    
1981     - cond = build2 (cond_code, boolean_type_node, fd->loop.v, fd->loop.n2);
1982     + tree n2 = fd->loop.n2;
1983     + if (fd->collapse > 1
1984     + && TREE_CODE (n2) != INTEGER_CST
1985     + && gimple_omp_for_combined_into_p (fd->for_stmt)
1986     + && gimple_code (ctx->outer->stmt) == GIMPLE_OMP_FOR)
1987     + {
1988     + gomp_for *gfor = as_a <gomp_for *> (ctx->outer->stmt);
1989     + if (gimple_omp_for_kind (gfor) == GF_OMP_FOR_KIND_FOR)
1990     + {
1991     + struct omp_for_data outer_fd;
1992     + extract_omp_for_data (gfor, &outer_fd, NULL);
1993     + n2 = fold_convert (TREE_TYPE (n2), outer_fd.loop.n2);
1994     + }
1995     + }
1996     + cond = build2 (cond_code, boolean_type_node, fd->loop.v, n2);
1997    
1998     clauses = gimple_omp_for_clauses (fd->for_stmt);
1999     stmts = NULL;
2000     @@ -11158,6 +11199,10 @@
2001     gimple_seq_add_stmt (&new_body, gimple_build_label (ctx->cancel_label));
2002     gimple_seq_add_seq (&new_body, par_olist);
2003     new_body = maybe_catch_exception (new_body);
2004     + if (gimple_code (stmt) == GIMPLE_OMP_TASK)
2005     + gimple_seq_add_stmt (&new_body,
2006     + gimple_build_omp_continue (integer_zero_node,
2007     + integer_zero_node));
2008     gimple_seq_add_stmt (&new_body, gimple_build_omp_return (false));
2009     gimple_omp_set_body (stmt, new_body);
2010    
2011     @@ -12272,6 +12317,10 @@
2012     somewhere other than the next block. This will be
2013     created later. */
2014     cur_region->exit = bb;
2015     + if (cur_region->type == GIMPLE_OMP_TASK)
2016     + /* Add an edge corresponding to not scheduling the task
2017     + immediately. */
2018     + make_edge (cur_region->entry, bb, EDGE_ABNORMAL);
2019     fallthru = cur_region->type != GIMPLE_OMP_SECTION;
2020     cur_region = cur_region->outer;
2021     break;
2022     @@ -12320,6 +12369,10 @@
2023     }
2024     break;
2025    
2026     + case GIMPLE_OMP_TASK:
2027     + fallthru = true;
2028     + break;
2029     +
2030     default:
2031     gcc_unreachable ();
2032     }
2033     --- a/gcc/tree.h 2015-04-08 20:41:55.000000000 +0200
2034     +++ b/gcc/tree.h 2015-05-23 11:32:41.673037980 +0200
2035     @@ -1320,6 +1320,11 @@
2036     #define OMP_PARALLEL_COMBINED(NODE) \
2037     (OMP_PARALLEL_CHECK (NODE)->base.private_flag)
2038    
2039     +/* True on an OMP_TEAMS statement if it represents an explicit
2040     + combined teams distribute constructs. */
2041     +#define OMP_TEAMS_COMBINED(NODE) \
2042     + (OMP_TEAMS_CHECK (NODE)->base.private_flag)
2043     +
2044     /* True if OMP_ATOMIC* is supposed to be sequentially consistent
2045     as opposed to relaxed. */
2046     #define OMP_ATOMIC_SEQ_CST(NODE) \
2047     --- a/gcc/tree-vrp.c 2015-02-17 16:32:05.000000000 +0100
2048     +++ b/gcc/tree-vrp.c 2015-05-23 11:18:33.967635057 +0200
2049     @@ -874,13 +874,18 @@
2050     if (is_new)
2051     {
2052     /* Do not allow transitions up the lattice. The following
2053     - is slightly more awkward than just new_vr->type < old_vr->type
2054     + is slightly more awkward than just new_vr->type < old_vr->type
2055     because VR_RANGE and VR_ANTI_RANGE need to be considered
2056     the same. We may not have is_new when transitioning to
2057     - UNDEFINED or from VARYING. */
2058     - if (new_vr->type == VR_UNDEFINED
2059     - || old_vr->type == VR_VARYING)
2060     - set_value_range_to_varying (old_vr);
2061     + UNDEFINED. If old_vr->type is VARYING, we shouldn't be
2062     + called. */
2063     + if (new_vr->type == VR_UNDEFINED)
2064     + {
2065     + BITMAP_FREE (new_vr->equiv);
2066     + set_value_range_to_varying (old_vr);
2067     + set_value_range_to_varying (new_vr);
2068     + return true;
2069     + }
2070     else
2071     set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
2072     new_vr->equiv);
2073     @@ -8949,6 +8954,9 @@
2074     fprintf (dump_file, "\n");
2075     }
2076    
2077     + if (vr_result.type == VR_VARYING)
2078     + return SSA_PROP_VARYING;
2079     +
2080     return SSA_PROP_INTERESTING;
2081     }
2082    
2083     --- a/gcc/ubsan.c 2015-04-09 21:51:08.000000000 +0200
2084     +++ b/gcc/ubsan.c 2015-05-23 11:22:23.302098186 +0200
2085     @@ -87,6 +87,7 @@
2086     #include "builtins.h"
2087     #include "tree-object-size.h"
2088     #include "tree-eh.h"
2089     +#include "tree-cfg.h"
2090    
2091     /* Map from a tree to a VAR_DECL tree. */
2092    
2093     @@ -1420,7 +1421,7 @@
2094     || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
2095     return;
2096    
2097     - bool can_throw = stmt_could_throw_p (stmt);
2098     + bool ends_bb = stmt_ends_bb_p (stmt);
2099     location_t loc = gimple_location (stmt);
2100     tree lhs = gimple_assign_lhs (stmt);
2101     tree ptype = build_pointer_type (TREE_TYPE (rhs));
2102     @@ -1432,7 +1433,7 @@
2103     tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g),
2104     build_int_cst (atype, 0));
2105     tree urhs = make_ssa_name (utype);
2106     - if (can_throw)
2107     + if (ends_bb)
2108     {
2109     gimple_assign_set_lhs (stmt, urhs);
2110     g = gimple_build_assign (lhs, NOP_EXPR, urhs);
2111     @@ -1469,7 +1470,7 @@
2112     gimple_set_location (g, loc);
2113     gsi_insert_after (gsi, g, GSI_NEW_STMT);
2114    
2115     - if (!can_throw)
2116     + if (!ends_bb)
2117     {
2118     gimple_assign_set_rhs_with_ops (&gsi2, NOP_EXPR, urhs);
2119     update_stmt (stmt);
2120     --- a/libstdc++-v3/include/debug/vector 2015-01-05 13:33:28.000000000 +0100
2121     +++ b/libstdc++-v3/include/debug/vector 2015-05-23 11:18:33.967635057 +0200
2122     @@ -69,13 +69,17 @@
2123    
2124     _Safe_vector&
2125     operator=(const _Safe_vector&) noexcept
2126     - { _M_update_guaranteed_capacity(); }
2127     + {
2128     + _M_update_guaranteed_capacity();
2129     + return *this;
2130     + }
2131    
2132     _Safe_vector&
2133     operator=(_Safe_vector&& __x) noexcept
2134     {
2135     _M_update_guaranteed_capacity();
2136     __x._M_guaranteed_capacity = 0;
2137     + return *this;
2138     }
2139     #endif
2140    
2141     --- a/libstdc++-v3/include/experimental/any 2015-01-05 13:33:28.000000000 +0100
2142     +++ b/libstdc++-v3/include/experimental/any 2015-05-23 11:20:55.285156612 +0200
2143     @@ -94,7 +94,7 @@
2144     std::aligned_storage<sizeof(_M_ptr), sizeof(_M_ptr)>::type _M_buffer;
2145     };
2146    
2147     - template<typename _Tp, typename _Safe = is_nothrow_move_constructible<_Tp>,
2148     + template<typename _Tp, typename _Safe = is_trivially_copyable<_Tp>,
2149     bool _Fits = (sizeof(_Tp) <= sizeof(_Storage))>
2150     using _Internal = std::integral_constant<bool, _Safe::value && _Fits>;
2151    
2152     --- a/libstdc++-v3/include/std/limits 2015-01-05 13:33:28.000000000 +0100
2153     +++ b/libstdc++-v3/include/std/limits 2015-05-23 11:22:05.903763794 +0200
2154     @@ -1490,7 +1490,8 @@
2155     min() _GLIBCXX_USE_NOEXCEPT { return 0; } \
2156     \
2157     static _GLIBCXX_CONSTEXPR unsigned TYPE \
2158     - max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max_b (TYPE, BITSIZE); } \
2159     + max() _GLIBCXX_USE_NOEXCEPT \
2160     + { return __glibcxx_max_b (unsigned TYPE, BITSIZE); } \
2161     \
2162     UEXT \
2163     \