7.0.1-0.4
This commit is contained in:
parent
4c8d27c4d6
commit
98a12cbd71
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
/nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.bz2
|
/nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.bz2
|
||||||
/nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.bz2
|
/nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.bz2
|
||||||
/gcc-7.0.1-20170128.tar.bz2
|
/gcc-7.0.1-20170128.tar.bz2
|
||||||
|
/gcc-7.0.1-20170131.tar.bz2
|
||||||
|
31
gcc.spec
31
gcc.spec
@ -1,10 +1,10 @@
|
|||||||
%global DATE 20170128
|
%global DATE 20170131
|
||||||
%global SVNREV 245003
|
%global SVNREV 245054
|
||||||
%global gcc_version 7.0.1
|
%global gcc_version 7.0.1
|
||||||
%global gcc_major 7
|
%global gcc_major 7
|
||||||
# Note, gcc_release must be integer, if you want to add suffixes to
|
# Note, gcc_release must be integer, if you want to add suffixes to
|
||||||
# %{release}, append them after %{gcc_release} on Release: line.
|
# %{release}, append them after %{gcc_release} on Release: line.
|
||||||
%global gcc_release 0.3
|
%global gcc_release 0.4
|
||||||
%global nvptx_tools_gitrev c28050f60193b3b95a18866a96f03334e874e78f
|
%global nvptx_tools_gitrev c28050f60193b3b95a18866a96f03334e874e78f
|
||||||
%global nvptx_newlib_gitrev aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24
|
%global nvptx_newlib_gitrev aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24
|
||||||
%global _unpackaged_files_terminate_build 0
|
%global _unpackaged_files_terminate_build 0
|
||||||
@ -228,6 +228,10 @@ Patch8: gcc7-no-add-needed.patch
|
|||||||
Patch9: gcc7-aarch64-async-unw-tables.patch
|
Patch9: gcc7-aarch64-async-unw-tables.patch
|
||||||
Patch10: gcc7-foffload-default.patch
|
Patch10: gcc7-foffload-default.patch
|
||||||
Patch11: gcc7-s390-asan.patch
|
Patch11: gcc7-s390-asan.patch
|
||||||
|
Patch12: gcc7-pr79197.patch
|
||||||
|
Patch13: gcc7-pr79232.patch
|
||||||
|
Patch14: gcc7-pr79288.patch
|
||||||
|
Patch15: gcc7-pr79170-workaround.patch
|
||||||
|
|
||||||
Patch1000: nvptx-tools-no-ptxas.patch
|
Patch1000: nvptx-tools-no-ptxas.patch
|
||||||
Patch1001: nvptx-tools-build.patch
|
Patch1001: nvptx-tools-build.patch
|
||||||
@ -816,6 +820,10 @@ package or when debugging this package.
|
|||||||
%patch9 -p0 -b .aarch64-async-unw-tables~
|
%patch9 -p0 -b .aarch64-async-unw-tables~
|
||||||
%patch10 -p0 -b .foffload-default~
|
%patch10 -p0 -b .foffload-default~
|
||||||
%patch11 -p0 -b .s390-asan~
|
%patch11 -p0 -b .s390-asan~
|
||||||
|
%patch12 -p0 -b .pr79197~
|
||||||
|
%patch13 -p0 -b .pr79232~
|
||||||
|
%patch14 -p0 -b .pr79288~
|
||||||
|
%patch15 -p0 -b .pr79170-workaround~
|
||||||
|
|
||||||
cd nvptx-tools-%{nvptx_tools_gitrev}
|
cd nvptx-tools-%{nvptx_tools_gitrev}
|
||||||
%patch1000 -p1 -b .nvptx-tools-no-ptxas~
|
%patch1000 -p1 -b .nvptx-tools-no-ptxas~
|
||||||
@ -1248,7 +1256,7 @@ rm -rf %{buildroot}%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_major}/ac
|
|||||||
rm -rf %{buildroot}%{_infodir} %{buildroot}%{_mandir}/man7 %{buildroot}%{_prefix}/share/locale
|
rm -rf %{buildroot}%{_infodir} %{buildroot}%{_mandir}/man7 %{buildroot}%{_prefix}/share/locale
|
||||||
rm -rf %{buildroot}%{_prefix}/lib/gcc/nvptx-none/%{gcc_major}/{install-tools,plugin}
|
rm -rf %{buildroot}%{_prefix}/lib/gcc/nvptx-none/%{gcc_major}/{install-tools,plugin}
|
||||||
rm -rf %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/{install-tools,plugin,include-fixed}
|
rm -rf %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/{install-tools,plugin,include-fixed}
|
||||||
rm -rf %{buildroot}%{_prefix}/%{_lib}/libcc1*
|
rm -rf %{buildroot}%{_prefix}/%{_lib}/libc[cp]1*
|
||||||
mv -f %{buildroot}%{_prefix}/nvptx-none/lib/*.{a,spec} %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/
|
mv -f %{buildroot}%{_prefix}/nvptx-none/lib/*.{a,spec} %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/
|
||||||
mv -f %{buildroot}%{_prefix}/nvptx-none/lib/mgomp/*.{a,spec} %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/mgomp/
|
mv -f %{buildroot}%{_prefix}/nvptx-none/lib/mgomp/*.{a,spec} %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/mgomp/
|
||||||
mv -f %{buildroot}%{_prefix}/lib/gcc/nvptx-none/%{gcc_major}/*.a %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/
|
mv -f %{buildroot}%{_prefix}/lib/gcc/nvptx-none/%{gcc_major}/*.a %{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/accel/nvptx-none/
|
||||||
@ -3206,6 +3214,7 @@ fi
|
|||||||
%dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}
|
%dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}
|
||||||
%dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin
|
%dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin
|
||||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin/libcc1plugin.so*
|
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin/libcc1plugin.so*
|
||||||
|
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin/libcp1plugin.so*
|
||||||
%doc rpm.doc/changelogs/libcc1/ChangeLog*
|
%doc rpm.doc/changelogs/libcc1/ChangeLog*
|
||||||
|
|
||||||
%if %{build_offload_nvptx}
|
%if %{build_offload_nvptx}
|
||||||
@ -3232,6 +3241,20 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jan 31 2017 Jakub Jelinek <jakub@redhat.com> 7.0.1-0.4
|
||||||
|
- update from the trunk
|
||||||
|
- PRs bootstrap/78985, debug/63238, debug/79289, gcov-profile/79259,
|
||||||
|
target/78945, target/79170, target/79240, target/79260, target/79268,
|
||||||
|
testsuite/70583, testsuite/79293, tree-optimization/79256,
|
||||||
|
tree-optimization/79267, tree-optimization/79276
|
||||||
|
- fix ICEs with powerpc conversion of float/double to 64-bit unsigned integer
|
||||||
|
(PR target/79197)
|
||||||
|
- fix C++ ICE with comma expression on lhs of assignment (PR c++/79232)
|
||||||
|
- fix default TLS model for C++ non-inline static data members (PR c++/79288)
|
||||||
|
- add workaround for powerpc constant size memcmp expansion bug (#1417753,
|
||||||
|
PR target/79170)
|
||||||
|
- libcp1plugin.so added to gcc-gdb-plugin for C++ support
|
||||||
|
|
||||||
* Sat Jan 28 2017 Jakub Jelinek <jakub@redhat.com> 7.0.1-0.3
|
* Sat Jan 28 2017 Jakub Jelinek <jakub@redhat.com> 7.0.1-0.3
|
||||||
- update from the trunk
|
- update from the trunk
|
||||||
- PRs c++/64382, c++/68727, c++/78771, c++/79176, debug/78835, debug/79129,
|
- PRs c++/64382, c++/68727, c++/78771, c++/79176, debug/78835, debug/79129,
|
||||||
|
16
gcc7-pr79170-workaround.patch
Normal file
16
gcc7-pr79170-workaround.patch
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
2017-01-31 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR target/79170
|
||||||
|
* config/rs6000/rs6000.c (expand_block_compare): Temporarily disable.
|
||||||
|
|
||||||
|
--- gcc/config/rs6000/rs6000.c.jj 2017-01-31 09:25:59.000000000 +0100
|
||||||
|
+++ gcc/config/rs6000/rs6000.c 2017-01-31 10:17:21.131929670 +0100
|
||||||
|
@@ -19462,7 +19462,7 @@ expand_block_compare (rtx operands[])
|
||||||
|
with carry instructions do not generate the 64-bit
|
||||||
|
carry and so we must emit code to calculate it ourselves.
|
||||||
|
We choose not to implement this yet. */
|
||||||
|
- if (TARGET_32BIT && TARGET_POWERPC64)
|
||||||
|
+ if ((TARGET_32BIT && TARGET_POWERPC64) || 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* If this is not a fixed size compare, just call memcmp. */
|
59
gcc7-pr79197.patch
Normal file
59
gcc7-pr79197.patch
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
2017-01-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR target/79197
|
||||||
|
* config/rs6000/rs6000.md (*fixuns_trunc<mode>di2_fctiduz): Rename to ...
|
||||||
|
(fixuns_trunc<mode>di2): ... this, remove previous expander. Put all
|
||||||
|
conditions on a single line.
|
||||||
|
|
||||||
|
* gcc.target/powerpc/pr79197.c: New test.
|
||||||
|
* gcc.c-torture/compile/pr79197.c: New test.
|
||||||
|
|
||||||
|
--- gcc/config/rs6000/rs6000.md.jj 2017-01-23 18:41:20.000000000 +0100
|
||||||
|
+++ gcc/config/rs6000/rs6000.md 2017-01-30 14:44:12.148761705 +0100
|
||||||
|
@@ -5712,17 +5712,10 @@ (define_insn_and_split "fixuns_trunc<mod
|
||||||
|
[(set_attr "length" "12")
|
||||||
|
(set_attr "type" "fp")])
|
||||||
|
|
||||||
|
-(define_expand "fixuns_trunc<mode>di2"
|
||||||
|
- [(set (match_operand:DI 0 "register_operand" "")
|
||||||
|
- (unsigned_fix:DI (match_operand:SFDF 1 "register_operand" "")))]
|
||||||
|
- "TARGET_HARD_FLOAT && (TARGET_FCTIDUZ || VECTOR_UNIT_VSX_P (<MODE>mode))"
|
||||||
|
- "")
|
||||||
|
-
|
||||||
|
-(define_insn "*fixuns_trunc<mode>di2_fctiduz"
|
||||||
|
+(define_insn "fixuns_trunc<mode>di2"
|
||||||
|
[(set (match_operand:DI 0 "gpc_reg_operand" "=d,wi")
|
||||||
|
(unsigned_fix:DI (match_operand:SFDF 1 "gpc_reg_operand" "<Ff>,<Fv>")))]
|
||||||
|
- "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FPRS
|
||||||
|
- && TARGET_FCTIDUZ"
|
||||||
|
+ "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FPRS && TARGET_FCTIDUZ"
|
||||||
|
"@
|
||||||
|
fctiduz %0,%1
|
||||||
|
xscvdpuxds %x0,%x1"
|
||||||
|
--- gcc/testsuite/gcc.target/powerpc/pr79197.c.jj 2017-01-30 14:54:55.533314402 +0100
|
||||||
|
+++ gcc/testsuite/gcc.target/powerpc/pr79197.c 2017-01-30 14:55:20.407988406 +0100
|
||||||
|
@@ -0,0 +1,11 @@
|
||||||
|
+/* PR target/79197 */
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-options "-O0 -mno-popcntd" } */
|
||||||
|
+
|
||||||
|
+unsigned a;
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (void)
|
||||||
|
+{
|
||||||
|
+ a = *(double *) (__UINTPTR_TYPE__) 0x400000;
|
||||||
|
+}
|
||||||
|
--- gcc/testsuite/gcc.c-torture/compile/pr79197.c.jj 2017-01-30 14:56:31.383058240 +0100
|
||||||
|
+++ gcc/testsuite/gcc.c-torture/compile/pr79197.c 2017-01-30 14:56:40.902933477 +0100
|
||||||
|
@@ -0,0 +1,10 @@
|
||||||
|
+/* PR target/79197 */
|
||||||
|
+
|
||||||
|
+unsigned long b;
|
||||||
|
+
|
||||||
|
+unsigned long
|
||||||
|
+foo (float *a, float *x)
|
||||||
|
+{
|
||||||
|
+ __builtin_memcpy (a, x, sizeof (float));
|
||||||
|
+ return *a;
|
||||||
|
+}
|
318
gcc7-pr79232.patch
Normal file
318
gcc7-pr79232.patch
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
2017-01-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/79232
|
||||||
|
* typeck.c (cp_build_modify_expr): Handle properly COMPOUND_EXPRs
|
||||||
|
on lhs that have {PRE{DEC,INC}REMENT,MODIFY,MIN,MAX,COND}_EXPR
|
||||||
|
in the rightmost operand.
|
||||||
|
|
||||||
|
* g++.dg/cpp1z/eval-order4.C: New test.
|
||||||
|
* g++.dg/other/pr79232.C: New test.
|
||||||
|
|
||||||
|
--- gcc/cp/typeck.c.jj 2017-01-30 09:31:43.076595640 +0100
|
||||||
|
+++ gcc/cp/typeck.c 2017-01-30 15:56:33.601002577 +0100
|
||||||
|
@@ -7568,16 +7568,26 @@ tree
|
||||||
|
cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode,
|
||||||
|
tree rhs, tsubst_flags_t complain)
|
||||||
|
{
|
||||||
|
- tree result;
|
||||||
|
+ tree result = NULL_TREE;
|
||||||
|
tree newrhs = rhs;
|
||||||
|
tree lhstype = TREE_TYPE (lhs);
|
||||||
|
+ tree olhs = lhs;
|
||||||
|
tree olhstype = lhstype;
|
||||||
|
bool plain_assign = (modifycode == NOP_EXPR);
|
||||||
|
+ bool compound_side_effects_p = false;
|
||||||
|
+ tree preeval = NULL_TREE;
|
||||||
|
|
||||||
|
/* Avoid duplicate error messages from operands that had errors. */
|
||||||
|
if (error_operand_p (lhs) || error_operand_p (rhs))
|
||||||
|
return error_mark_node;
|
||||||
|
|
||||||
|
+ while (TREE_CODE (lhs) == COMPOUND_EXPR)
|
||||||
|
+ {
|
||||||
|
+ if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
|
||||||
|
+ compound_side_effects_p = true;
|
||||||
|
+ lhs = TREE_OPERAND (lhs, 1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Handle control structure constructs used as "lvalues". Note that we
|
||||||
|
leave COMPOUND_EXPR on the LHS because it is sequenced after the RHS. */
|
||||||
|
switch (TREE_CODE (lhs))
|
||||||
|
@@ -7585,20 +7595,57 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
/* Handle --foo = 5; as these are valid constructs in C++. */
|
||||||
|
case PREDECREMENT_EXPR:
|
||||||
|
case PREINCREMENT_EXPR:
|
||||||
|
+ if (compound_side_effects_p)
|
||||||
|
+ {
|
||||||
|
+ if (VOID_TYPE_P (TREE_TYPE (rhs)))
|
||||||
|
+ {
|
||||||
|
+ if (complain & tf_error)
|
||||||
|
+ error ("void value not ignored as it ought to be");
|
||||||
|
+ return error_mark_node;
|
||||||
|
+ }
|
||||||
|
+ newrhs = rhs = stabilize_expr (rhs, &preeval);
|
||||||
|
+ }
|
||||||
|
if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
|
||||||
|
lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
|
||||||
|
cp_stabilize_reference (TREE_OPERAND (lhs, 0)),
|
||||||
|
TREE_OPERAND (lhs, 1));
|
||||||
|
lhs = build2 (COMPOUND_EXPR, lhstype, lhs, TREE_OPERAND (lhs, 0));
|
||||||
|
+ maybe_add_compound:
|
||||||
|
+ /* If we had (bar, --foo) = 5; or (bar, (baz, --foo)) = 5;
|
||||||
|
+ and looked through the COMPOUND_EXPRs, readd them now around
|
||||||
|
+ the resulting lhs. */
|
||||||
|
+ if (TREE_CODE (olhs) == COMPOUND_EXPR)
|
||||||
|
+ {
|
||||||
|
+ lhs = build2 (COMPOUND_EXPR, lhstype, TREE_OPERAND (olhs, 0), lhs);
|
||||||
|
+ tree *ptr = &TREE_OPERAND (lhs, 1);
|
||||||
|
+ for (olhs = TREE_OPERAND (olhs, 1);
|
||||||
|
+ TREE_CODE (olhs) == COMPOUND_EXPR;
|
||||||
|
+ olhs = TREE_OPERAND (olhs, 1))
|
||||||
|
+ {
|
||||||
|
+ *ptr = build2 (COMPOUND_EXPR, lhstype,
|
||||||
|
+ TREE_OPERAND (olhs, 0), *ptr);
|
||||||
|
+ ptr = &TREE_OPERAND (*ptr, 1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MODIFY_EXPR:
|
||||||
|
+ if (compound_side_effects_p)
|
||||||
|
+ {
|
||||||
|
+ if (VOID_TYPE_P (TREE_TYPE (rhs)))
|
||||||
|
+ {
|
||||||
|
+ if (complain & tf_error)
|
||||||
|
+ error ("void value not ignored as it ought to be");
|
||||||
|
+ return error_mark_node;
|
||||||
|
+ }
|
||||||
|
+ newrhs = rhs = stabilize_expr (rhs, &preeval);
|
||||||
|
+ }
|
||||||
|
if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
|
||||||
|
lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
|
||||||
|
cp_stabilize_reference (TREE_OPERAND (lhs, 0)),
|
||||||
|
TREE_OPERAND (lhs, 1));
|
||||||
|
lhs = build2 (COMPOUND_EXPR, lhstype, lhs, TREE_OPERAND (lhs, 0));
|
||||||
|
- break;
|
||||||
|
+ goto maybe_add_compound;
|
||||||
|
|
||||||
|
case MIN_EXPR:
|
||||||
|
case MAX_EXPR:
|
||||||
|
@@ -7626,7 +7673,6 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
except that the RHS goes through a save-expr
|
||||||
|
so the code to compute it is only emitted once. */
|
||||||
|
tree cond;
|
||||||
|
- tree preeval = NULL_TREE;
|
||||||
|
|
||||||
|
if (VOID_TYPE_P (TREE_TYPE (rhs)))
|
||||||
|
{
|
||||||
|
@@ -7652,14 +7698,31 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
|
||||||
|
if (cond == error_mark_node)
|
||||||
|
return cond;
|
||||||
|
+ /* If we had (e, (a ? b : c)) = d; or (e, (f, (a ? b : c))) = d;
|
||||||
|
+ and looked through the COMPOUND_EXPRs, readd them now around
|
||||||
|
+ the resulting cond before adding the preevaluated rhs. */
|
||||||
|
+ if (TREE_CODE (olhs) == COMPOUND_EXPR)
|
||||||
|
+ {
|
||||||
|
+ cond = build2 (COMPOUND_EXPR, TREE_TYPE (cond),
|
||||||
|
+ TREE_OPERAND (olhs, 0), cond);
|
||||||
|
+ tree *ptr = &TREE_OPERAND (cond, 1);
|
||||||
|
+ for (olhs = TREE_OPERAND (olhs, 1);
|
||||||
|
+ TREE_CODE (olhs) == COMPOUND_EXPR;
|
||||||
|
+ olhs = TREE_OPERAND (olhs, 1))
|
||||||
|
+ {
|
||||||
|
+ *ptr = build2 (COMPOUND_EXPR, TREE_TYPE (cond),
|
||||||
|
+ TREE_OPERAND (olhs, 0), *ptr);
|
||||||
|
+ ptr = &TREE_OPERAND (*ptr, 1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
/* Make sure the code to compute the rhs comes out
|
||||||
|
before the split. */
|
||||||
|
- if (preeval)
|
||||||
|
- cond = build2 (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
|
||||||
|
- return cond;
|
||||||
|
+ result = cond;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
+ lhs = olhs;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -7675,7 +7738,7 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
rhs = convert (lhstype, rhs);
|
||||||
|
result = build2 (INIT_EXPR, lhstype, lhs, rhs);
|
||||||
|
TREE_SIDE_EFFECTS (result) = 1;
|
||||||
|
- return result;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
else if (! MAYBE_CLASS_TYPE_P (lhstype))
|
||||||
|
/* Do the default thing. */;
|
||||||
|
@@ -7688,7 +7751,7 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
release_tree_vector (rhs_vec);
|
||||||
|
if (result == NULL_TREE)
|
||||||
|
return error_mark_node;
|
||||||
|
- return result;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
@@ -7703,7 +7766,7 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
{
|
||||||
|
result = objc_maybe_build_modify_expr (lhs, rhs);
|
||||||
|
if (result)
|
||||||
|
- return result;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* `operator=' is not an inheritable operator. */
|
||||||
|
@@ -7717,7 +7780,7 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
complain);
|
||||||
|
if (result == NULL_TREE)
|
||||||
|
return error_mark_node;
|
||||||
|
- return result;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
lhstype = olhstype;
|
||||||
|
}
|
||||||
|
@@ -7762,7 +7825,7 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
{
|
||||||
|
result = objc_maybe_build_modify_expr (lhs, newrhs);
|
||||||
|
if (result)
|
||||||
|
- return result;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gcc_assert (TREE_CODE (lhstype) != REFERENCE_TYPE);
|
||||||
|
@@ -7858,9 +7921,10 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
|
||||||
|
from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
|
||||||
|
? 1 + (modifycode != INIT_EXPR): 0;
|
||||||
|
- return build_vec_init (lhs, NULL_TREE, newrhs,
|
||||||
|
- /*explicit_value_init_p=*/false,
|
||||||
|
- from_array, complain);
|
||||||
|
+ result = build_vec_init (lhs, NULL_TREE, newrhs,
|
||||||
|
+ /*explicit_value_init_p=*/false,
|
||||||
|
+ from_array, complain);
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modifycode == INIT_EXPR)
|
||||||
|
@@ -7899,7 +7963,7 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
result = objc_generate_write_barrier (lhs, modifycode, newrhs);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
- return result;
|
||||||
|
+ goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = build2 (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
|
||||||
|
@@ -7909,6 +7973,9 @@ cp_build_modify_expr (location_t loc, tr
|
||||||
|
if (!plain_assign)
|
||||||
|
TREE_NO_WARNING (result) = 1;
|
||||||
|
|
||||||
|
+ ret:
|
||||||
|
+ if (preeval)
|
||||||
|
+ result = build2 (COMPOUND_EXPR, TREE_TYPE (result), preeval, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- gcc/testsuite/g++.dg/cpp1z/eval-order4.C.jj 2017-01-30 16:08:22.195641383 +0100
|
||||||
|
+++ gcc/testsuite/g++.dg/cpp1z/eval-order4.C 2017-01-30 16:08:09.000000000 +0100
|
||||||
|
@@ -0,0 +1,80 @@
|
||||||
|
+// PR c++/79232
|
||||||
|
+// { dg-do run }
|
||||||
|
+// { dg-options "-fstrong-eval-order" }
|
||||||
|
+
|
||||||
|
+int last = 0;
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+foo (int i)
|
||||||
|
+{
|
||||||
|
+ if (i != last + 1)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = i;
|
||||||
|
+ return i;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+char a, b;
|
||||||
|
+int c;
|
||||||
|
+
|
||||||
|
+char &
|
||||||
|
+bar (int i, int j)
|
||||||
|
+{
|
||||||
|
+ foo (i);
|
||||||
|
+ return j ? a : b;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+ (foo (2) ? bar (3, 0) : bar (3, 1)) = foo (1);
|
||||||
|
+ if (last != 3)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), foo (3) ? bar (4, 0) : bar (4, 1)) = foo (1);
|
||||||
|
+ if (last != 4)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), (foo (3) ? bar (4, 0) : bar (4, 1))) = foo (1);
|
||||||
|
+ if (last != 4)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), foo (3), foo (4) ? bar (5, 0) : bar (5, 1)) = foo (1);
|
||||||
|
+ if (last != 5)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), (foo (3), (foo (4) ? bar (5, 0) : bar (5, 1)))) = foo (1);
|
||||||
|
+ if (last != 5)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ --c = foo (1);
|
||||||
|
+ if (c != 1)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), --c) = foo (1);
|
||||||
|
+ if (last != 2 || c != 1)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), foo (3), --c) = foo (1);
|
||||||
|
+ if (last != 3 || c != 1)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), (foo (3), --c)) = foo (1);
|
||||||
|
+ if (last != 3 || c != 1)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ bar (2, 0) = foo (1);
|
||||||
|
+ if (last != 2)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), bar (3, 0)) = foo (1);
|
||||||
|
+ if (last != 3)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), foo (3), bar (4, 0)) = foo (1);
|
||||||
|
+ if (last != 4)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+ last = 0;
|
||||||
|
+ (foo (2), (foo (3), bar (4, 0))) = foo (1);
|
||||||
|
+ if (last != 4)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+}
|
||||||
|
--- gcc/testsuite/g++.dg/other/pr79232.C.jj 2017-01-30 13:37:32.095090643 +0100
|
||||||
|
+++ gcc/testsuite/g++.dg/other/pr79232.C 2017-01-30 13:35:17.000000000 +0100
|
||||||
|
@@ -0,0 +1,12 @@
|
||||||
|
+// PR c++/79232
|
||||||
|
+// { dg-do compile }
|
||||||
|
+
|
||||||
|
+extern char a[];
|
||||||
|
+int b;
|
||||||
|
+char c, e;
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (long d)
|
||||||
|
+{
|
||||||
|
+ (0, b ? &c : a)[d] = e;
|
||||||
|
+}
|
72
gcc7-pr79288.patch
Normal file
72
gcc7-pr79288.patch
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
2017-01-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/79288
|
||||||
|
* decl.c (grokdeclarator): For static data members, handle thread_p
|
||||||
|
only after handling inline.
|
||||||
|
|
||||||
|
* g++.dg/tls/pr79288.C: New test.
|
||||||
|
|
||||||
|
--- gcc/cp/decl.c.jj 2017-01-26 09:14:24.000000000 +0100
|
||||||
|
+++ gcc/cp/decl.c 2017-01-30 18:49:38.544438710 +0100
|
||||||
|
@@ -12049,14 +12049,6 @@ grokdeclarator (const cp_declarator *dec
|
||||||
|
: input_location,
|
||||||
|
VAR_DECL, unqualified_id, type);
|
||||||
|
set_linkage_for_static_data_member (decl);
|
||||||
|
- if (thread_p)
|
||||||
|
- {
|
||||||
|
- CP_DECL_THREAD_LOCAL_P (decl) = true;
|
||||||
|
- if (!processing_template_decl)
|
||||||
|
- set_decl_tls_model (decl, decl_default_tls_model (decl));
|
||||||
|
- if (declspecs->gnu_thread_keyword_p)
|
||||||
|
- SET_DECL_GNU_TLS_P (decl);
|
||||||
|
- }
|
||||||
|
if (concept_p)
|
||||||
|
error ("static data member %qE declared %<concept%>",
|
||||||
|
unqualified_id);
|
||||||
|
@@ -12077,6 +12069,15 @@ grokdeclarator (const cp_declarator *dec
|
||||||
|
definition is provided, unless this is an inline
|
||||||
|
variable. */
|
||||||
|
DECL_EXTERNAL (decl) = 1;
|
||||||
|
+
|
||||||
|
+ if (thread_p)
|
||||||
|
+ {
|
||||||
|
+ CP_DECL_THREAD_LOCAL_P (decl) = true;
|
||||||
|
+ if (!processing_template_decl)
|
||||||
|
+ set_decl_tls_model (decl, decl_default_tls_model (decl));
|
||||||
|
+ if (declspecs->gnu_thread_keyword_p)
|
||||||
|
+ SET_DECL_GNU_TLS_P (decl);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
--- gcc/testsuite/g++.dg/tls/pr79288.C.jj 2017-01-30 18:55:05.754282818 +0100
|
||||||
|
+++ gcc/testsuite/g++.dg/tls/pr79288.C 2017-01-30 18:54:52.000000000 +0100
|
||||||
|
@@ -0,0 +1,28 @@
|
||||||
|
+// PR c++/79288
|
||||||
|
+// { dg-do compile { target nonpic } }
|
||||||
|
+// { dg-require-effective-target tls }
|
||||||
|
+// { dg-options "-O2" }
|
||||||
|
+// { dg-final { scan-assembler-not "@tpoff" { target i?86-*-* x86_64-*-* } } }
|
||||||
|
+
|
||||||
|
+struct S
|
||||||
|
+{
|
||||||
|
+ static __thread int *p;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+template <int N>
|
||||||
|
+struct T
|
||||||
|
+{
|
||||||
|
+ static __thread int *p;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int *
|
||||||
|
+foo ()
|
||||||
|
+{
|
||||||
|
+ return S::p;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int *
|
||||||
|
+bar ()
|
||||||
|
+{
|
||||||
|
+ return T<0>::p;
|
||||||
|
+}
|
2
sources
2
sources
@ -1,3 +1,3 @@
|
|||||||
SHA512 (gcc-7.0.1-20170128.tar.bz2) = 41edc3cd3cf59816aa8f6f5c410a6c5a0332eadf65d0ccd478367767c17d909462280f439a9a96b61c72d447b17caa8b5fa0ddea22c25a79be2fd63675088e49
|
SHA512 (gcc-7.0.1-20170131.tar.bz2) = 976af1e513fe6f701cf3e83503e2a44560e37f0f33622c45b4d1fe119006c7cc9d45584df5e760a41c4767be036dee24d88a33379ff65366b187605f463ea1b0
|
||||||
SHA512 (nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.bz2) = 38f97c9297ad108568352a4d28277455a3c01fd8b7864e798037e5006b6f757022e874bbf3f165775fe3b873781bc108137bbeb42dd5ed3c7d3e6747746fa918
|
SHA512 (nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.bz2) = 38f97c9297ad108568352a4d28277455a3c01fd8b7864e798037e5006b6f757022e874bbf3f165775fe3b873781bc108137bbeb42dd5ed3c7d3e6747746fa918
|
||||||
SHA512 (nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.bz2) = 95b577a06a93bb044dbc8033e550cb36bcf2ab2687da030a7318cdc90e7467ed49665e247dcafb5ff4a7e92cdc264291d19728bd17fab902fb64b22491269330
|
SHA512 (nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.bz2) = 95b577a06a93bb044dbc8033e550cb36bcf2ab2687da030a7318cdc90e7467ed49665e247dcafb5ff4a7e92cdc264291d19728bd17fab902fb64b22491269330
|
||||||
|
Loading…
Reference in New Issue
Block a user