diff --git a/gcc41-debug-fortran-array.patch b/gcc41-debug-fortran-array.patch new file mode 100644 index 0000000..69764cb --- /dev/null +++ b/gcc41-debug-fortran-array.patch @@ -0,0 +1,33 @@ +2007-12-10 Jakub Jelinek + + * dwarf2out.c (gen_array_type_die, gen_descr_array_type_die): For + Fortran multi-dimensional arrays use DW_AT_ordering + DW_ORD_col_major. + +--- gcc/dwarf2out.c (revision 130741) ++++ gcc/dwarf2out.c (revision 130742) +@@ -11636,6 +11636,12 @@ gen_array_type_die (tree type, dw_die_re + add_AT_flag (array_die, DW_AT_GNU_vector, 1); + } + ++ /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */ ++ if (is_fortran () ++ && TREE_CODE (type) == ARRAY_TYPE ++ && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE) ++ add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major); ++ + #if 0 + /* We default the array ordering. SDB will probably do + the right things even if DW_AT_ordering is not present. It's not even +@@ -11787,6 +11793,11 @@ gen_descr_array_type_die (tree type, str + add_name_attribute (array_die, type_tag (type)); + equate_type_number_to_die (type, array_die); + ++ /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */ ++ if (is_fortran () ++ && info->ndimensions >= 2) ++ add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major); ++ + if (info->data_location) + add_descr_info_field (array_die, DW_AT_data_location, info->data_location, + info->base_decl); diff --git a/gcc41-omp-outer-ctx.patch b/gcc41-omp-outer-ctx.patch new file mode 100644 index 0000000..7f0b1f6 --- /dev/null +++ b/gcc41-omp-outer-ctx.patch @@ -0,0 +1,133 @@ +2007-12-03 Jakub Jelinek + + * omp-low.c (lookup_decl_in_outer_ctx): Allow calling this + with !ctx->is_nested. + (maybe_lookup_decl_in_outer_ctx): Look up in outer contexts + even if !ctx->is_nested. + (lower_copyprivate_clauses, lower_send_clauses, + lower_send_shared_vars): Call lookup_decl_in_outer_ctx + unconditionally. + + * testsuite/libgomp.c/private-1.c: New test. + +--- gcc/omp-low.c (revision 130589) ++++ gcc/omp-low.c (revision 130590) +@@ -1518,12 +1518,10 @@ lookup_decl_in_outer_ctx (tree decl, omp + tree t; + omp_context *up; + +- gcc_assert (ctx->is_nested); +- + for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer) + t = maybe_lookup_decl (decl, up); + +- gcc_assert (t || is_global_var (decl)); ++ gcc_assert (!ctx->is_nested || t || is_global_var (decl)); + + return t ? t : decl; + } +@@ -1538,9 +1536,8 @@ maybe_lookup_decl_in_outer_ctx (tree dec + tree t = NULL; + omp_context *up; + +- if (ctx->is_nested) +- for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer) +- t = maybe_lookup_decl (decl, up); ++ for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer) ++ t = maybe_lookup_decl (decl, up); + + return t ? t : decl; + } +@@ -2012,7 +2009,7 @@ lower_copyprivate_clauses (tree clauses, + by_ref = use_pointer_for_field (var, false); + + ref = build_sender_ref (var, ctx); +- x = (ctx->is_nested) ? lookup_decl_in_outer_ctx (var, ctx) : var; ++ x = lookup_decl_in_outer_ctx (var, ctx); + x = by_ref ? build_fold_addr_expr (x) : x; + x = build_gimple_modify_stmt (ref, x); + gimplify_and_add (x, slist); +@@ -2053,9 +2050,8 @@ lower_send_clauses (tree clauses, tree * + continue; + } + +- var = val = OMP_CLAUSE_DECL (c); +- if (ctx->is_nested) +- var = lookup_decl_in_outer_ctx (val, ctx); ++ val = OMP_CLAUSE_DECL (c); ++ var = lookup_decl_in_outer_ctx (val, ctx); + + if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_COPYIN + && is_global_var (var)) +@@ -2127,13 +2123,10 @@ lower_send_shared_vars (tree *ilist, tre + if (!nvar || !DECL_HAS_VALUE_EXPR_P (nvar)) + continue; + +- var = ovar; +- + /* If CTX is a nested parallel directive. Find the immediately + enclosing parallel or workshare construct that contains a + mapping for OVAR. */ +- if (ctx->is_nested) +- var = lookup_decl_in_outer_ctx (ovar, ctx); ++ var = lookup_decl_in_outer_ctx (ovar, ctx); + + if (use_pointer_for_field (ovar, true)) + { +--- libgomp/testsuite/libgomp.c/private-1.c (revision 0) ++++ libgomp/testsuite/libgomp.c/private-1.c (revision 130590) +@@ -0,0 +1,54 @@ ++extern void abort (void); ++ ++int a = 18; ++ ++void ++f1 (int i, int j, int k) ++{ ++ int l = 6, m = 7, n = 8; ++#pragma omp parallel private(j, m) shared(k, n) firstprivate(i, l) \ ++ num_threads(1) ++ { ++ j = 6; ++ m = 5; ++ if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9) ++ #pragma omp atomic ++ k++; ++ } ++ if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9) ++ abort (); ++} ++ ++int v1 = 1, v2 = 2, v5 = 5; ++int err; ++ ++void ++f2 (void) ++{ ++ int v3 = 3; ++#pragma omp sections private (v1) firstprivate (v2) ++ { ++ #pragma omp section ++ { ++ int v4 = 4; ++ v1 = 7; ++ #pragma omp parallel num_threads(1) firstprivate(v1, v2, v3, v4) ++ { ++ if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6) ++ err = 1; ++ } ++ if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6) ++ abort (); ++ if (err) ++ abort (); ++ } ++ } ++} ++ ++int ++main (void) ++{ ++ f1 (8, 26, 0); ++ f2 (); ++ return 0; ++} diff --git a/gcc41-pr34094.patch b/gcc41-pr34094.patch deleted file mode 100644 index fd4a38c..0000000 --- a/gcc41-pr34094.patch +++ /dev/null @@ -1,60 +0,0 @@ -2007-11-22 Jakub Jelinek - - PR c++/34094 - * decl2.c (cp_write_global_declarations): Issue error about static - data members in anonymous namespace which are declared and used, - but not defined. - - * g++.dg/ext/visibility/anon7.C: New test. - ---- gcc/cp/decl2.c (revision 130350) -+++ gcc/cp/decl2.c (revision 130351) -@@ -3365,7 +3365,21 @@ cp_write_global_declarations (void) - /* If this static data member is needed, provide it to the - back end. */ - if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl)) -- DECL_EXTERNAL (decl) = 0; -+ { -+ /* Error on -+ namespace { struct A { static int i; }; } -+ int foo () { return A::i; } -+ without A::i definition (which can't be defined in -+ a different CU because of the anonymous namespace). -+ Don't do this if DECL_INITIAL is set, because for -+ namespace { struct A { static const int i = 4; } }; -+ decl_needed_p won't reliably detect whether it was -+ really needed. */ -+ if (DECL_IN_AGGR_P (decl) && DECL_INITIAL (decl) == NULL_TREE) -+ error ("%Jstatic data member %qD used, but not defined", -+ decl, decl); -+ DECL_EXTERNAL (decl) = 0; -+ } - } - if (VEC_length (tree, pending_statics) != 0 - && wrapup_global_declarations (VEC_address (tree, pending_statics), ---- gcc/testsuite/g++.dg/ext/visibility/anon7.C (revision 0) -+++ gcc/testsuite/g++.dg/ext/visibility/anon7.C (revision 130351) -@@ -0,0 +1,23 @@ -+// PR c++/34094 -+// { dg-do compile } -+ -+namespace -+{ -+ struct A { -+ static int bar (); -+ static int i; // { dg-error "used, but not defined" } -+ static int j; -+ static int k; -+ static int l; -+ static const int m = 16; -+ static const int n = 17; -+ }; -+ int A::j = 4; -+ int A::k; -+ const int A::m; -+} -+ -+int foo (void) -+{ -+ return A::i + A::j + A::k + A::m + A::n + A::bar (); -+} diff --git a/gcc41-pr34178.patch b/gcc41-pr34178.patch new file mode 100644 index 0000000..7d9e655 --- /dev/null +++ b/gcc41-pr34178.patch @@ -0,0 +1,128 @@ +2007-12-09 Jakub Jelinek + + PR c++/34178 + PR c++/34340 + * repo.c (repo_emit_p): Return 2 for DECL_INTEGRAL_CONSTANT_VAR_P + in class scope rather than DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P. + Return 2 also if DECL_EXPLICIT_INSTANTIATION. + * decl2.c (import_export_decl): Don't make VAR_DECLs import_p when + flag_use_repository and repo_emit_p returned 2. + + * g++.dg/template/repo6.C: New test. + * g++.dg/template/repo7.C: New test. + * g++.dg/template/repo8.C: New test. + +--- gcc/cp/decl2.c (revision 130726) ++++ gcc/cp/decl2.c (revision 130727) +@@ -2230,7 +2230,8 @@ import_export_decl (tree decl) + { + /* DECL is an implicit instantiation of a function or static + data member. */ +- if (flag_implicit_templates ++ if ((flag_implicit_templates ++ && !flag_use_repository) + || (flag_implicit_inline_templates + && TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl))) +--- gcc/cp/repo.c (revision 130726) ++++ gcc/cp/repo.c (revision 130727) +@@ -304,16 +304,19 @@ repo_emit_p (tree decl) + && (!TYPE_LANG_SPECIFIC (type) + || !CLASSTYPE_TEMPLATE_INSTANTIATION (type))) + return 2; +- /* Static data members initialized by constant expressions must ++ /* Const static data members initialized by constant expressions must + be processed where needed so that their definitions are + available. */ +- if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) ++ if (DECL_INTEGRAL_CONSTANT_VAR_P (decl) + && DECL_CLASS_SCOPE_P (decl)) + return 2; + } + else if (!DECL_TEMPLATE_INSTANTIATION (decl)) + return 2; + ++ if (DECL_EXPLICIT_INSTANTIATION (decl)) ++ return 2; ++ + /* For constructors and destructors, the repository contains + information about the clones -- not the original function -- + because only the clones are emitted in the object file. */ +--- gcc/testsuite/g++.dg/template/repo7.C (revision 0) ++++ gcc/testsuite/g++.dg/template/repo7.C (revision 130727) +@@ -0,0 +1,23 @@ ++// PR c++/34340 ++// { dg-options "-frepo" } ++// { dg-final { cleanup-repo-files } } ++ ++struct A ++{ ++ int a; ++}; ++ ++template struct D ++{ ++ static const A b; ++}; ++ ++template const A D::b = { 2 }; ++template class D; ++ ++const A *x = &D::b; ++ ++int ++main () ++{ ++} +--- gcc/testsuite/g++.dg/template/repo8.C (revision 0) ++++ gcc/testsuite/g++.dg/template/repo8.C (revision 130727) +@@ -0,0 +1,22 @@ ++// PR c++/34340 ++// { dg-options "-frepo" } ++// { dg-final { cleanup-repo-files } } ++ ++struct A ++{ ++ int a; ++}; ++ ++template struct D ++{ ++ static const A b; ++}; ++ ++template const A D::b = { 2 }; ++ ++const A *x = &D::b; ++ ++int ++main () ++{ ++} +--- gcc/testsuite/g++.dg/template/repo6.C (revision 0) ++++ gcc/testsuite/g++.dg/template/repo6.C (revision 130727) +@@ -0,0 +1,24 @@ ++// PR c++/34178 ++// { dg-options "-frepo" } ++// { dg-final { cleanup-repo-files } } ++ ++template ++class A ++{ ++private: ++ static const int x; ++ static int y; ++ ++public: ++ int getX () { return x + y; } ++}; ++ ++template const int A::x = 0; ++template int A::y = 0; ++ ++int ++main () ++{ ++ A a; ++ return a.getX(); ++} diff --git a/gcc41-pr34238.patch b/gcc41-pr34238.patch deleted file mode 100644 index 6a38f58..0000000 --- a/gcc41-pr34238.patch +++ /dev/null @@ -1,34 +0,0 @@ -2007-11-26 Jakub Jelinek - - PR c++/34238 - * decl2.c (cp_write_global_declarations): Test - !DECL_INITIALIZED_IN_CLASS_P instead of checking NULL - DECL_INITIAL. - - * g++.dg/ext/visibility/anon9.C: New test. - ---- gcc/cp/decl2.c.jj 2007-11-22 15:03:54.000000000 +0100 -+++ gcc/cp/decl2.c 2007-11-26 21:04:38.000000000 +0100 -@@ -3375,7 +3375,7 @@ cp_write_global_declarations (void) - namespace { struct A { static const int i = 4; } }; - decl_needed_p won't reliably detect whether it was - really needed. */ -- if (DECL_IN_AGGR_P (decl) && DECL_INITIAL (decl) == NULL_TREE) -+ if (DECL_IN_AGGR_P (decl) && !DECL_INITIALIZED_IN_CLASS_P (decl)) - error ("%Jstatic data member %qD used, but not defined", - decl, decl); - DECL_EXTERNAL (decl) = 0; ---- gcc/testsuite/g++.dg/ext/visibility/anon9.C.jj 2007-11-26 21:37:34.000000000 +0100 -+++ gcc/testsuite/g++.dg/ext/visibility/anon9.C 2007-11-26 21:38:01.000000000 +0100 -@@ -0,0 +1,11 @@ -+// PR c++/34238 -+// { dg-do compile } -+ -+namespace -+{ -+ template struct A -+ { -+ static const bool a = true; -+ }; -+} -+struct A<> a; diff --git a/gcc41-pr34364.patch b/gcc41-pr34364.patch new file mode 100644 index 0000000..e21a607 --- /dev/null +++ b/gcc41-pr34364.patch @@ -0,0 +1,54 @@ +2007-12-11 Jakub Jelinek + + PR c++/34364 + * rtti.c (build_dynamic_cast): Call convert_from_reference even for + dynamic_cast in a template. + + * g++.dg/rtti/dyncast2.C: New test. + +--- gcc/cp/rtti.c (revision 130769) ++++ gcc/cp/rtti.c (revision 130770) +@@ -728,8 +728,7 @@ build_dynamic_cast (tree type, tree expr + { + expr = build_min (DYNAMIC_CAST_EXPR, type, expr); + TREE_SIDE_EFFECTS (expr) = 1; +- +- return expr; ++ return convert_from_reference (expr); + } + + return convert_from_reference (build_dynamic_cast_1 (type, expr)); +--- gcc/testsuite/g++.dg/rtti/dyncast2.C (revision 0) ++++ gcc/testsuite/g++.dg/rtti/dyncast2.C (revision 130770) +@@ -0,0 +1,31 @@ ++// PR c++/34364 ++// { dg-do run } ++ ++struct A ++{ ++ virtual ~A () {} ++}; ++ ++struct B : public A ++{ ++ template struct C ++ { ++ static void f (A &a) ++ { ++ dynamic_cast (a).g (); ++ } ++ }; ++ ++ B () : c (6) {} ++ void g () { c++; } ++ int c; ++}; ++ ++B b; ++ ++int ++main (void) ++{ ++ B::C::f (b); ++ return b.c != 7; ++} diff --git a/gcc41-pr34394.patch b/gcc41-pr34394.patch new file mode 100644 index 0000000..7449f43 --- /dev/null +++ b/gcc41-pr34394.patch @@ -0,0 +1,29 @@ +2007-12-10 Jakub Jelinek + + PR c++/34394 + * error.c (dump_expr): Handle ABS_EXPR. + + * g++.dg/other/error22.C: New test. + +--- gcc/cp/error.c (revision 130743) ++++ gcc/cp/error.c (revision 130744) +@@ -1757,6 +1757,7 @@ dump_expr (tree t, int flags) + break; + + case SCOPE_REF: ++ case ABS_EXPR: + pp_expression (cxx_pp, t); + break; + +--- gcc/testsuite/g++.dg/other/error22.C (revision 0) ++++ gcc/testsuite/g++.dg/other/error22.C (revision 130744) +@@ -0,0 +1,9 @@ ++// PR c++/34394 ++// { dg-do compile } ++ ++extern double fabs (double); ++ ++void foo (double x) ++{ ++ fabs (x) (); // { dg-error "__builtin_abs" } ++} diff --git a/gcc41.spec b/gcc41.spec index d90a379..ba32978 100644 --- a/gcc41.spec +++ b/gcc41.spec @@ -1,6 +1,6 @@ %define DATE 20071124 %define gcc_version 4.1.2 -%define gcc_release 35 +%define gcc_release 36 %define _unpackaged_files_terminate_build 0 %define multilib_64_archs sparc64 ppc64 s390x x86_64 %define include_gappletviewer 1 @@ -195,14 +195,17 @@ Patch69: gcc41-pr33844.patch Patch70: gcc41-pr33962.patch Patch71: gcc41-pr34070.patch Patch72: gcc41-pr34089.patch -Patch73: gcc41-pr34094.patch +Patch73: gcc41-pr34178.patch Patch74: gcc41-pr34130.patch Patch75: gcc41-pr34146.patch Patch76: gcc41-rh364001.patch Patch77: gcc41-pr34213.patch -Patch78: gcc41-pr34238.patch +Patch78: gcc41-pr34364.patch Patch79: gcc41-pr34275.patch Patch80: gcc41-rh407281.patch +Patch81: gcc41-pr34394.patch +Patch82: gcc41-debug-fortran-array.patch +Patch83: gcc41-omp-outer-ctx.patch # On ARM EABI systems, we do want -gnueabi to be part of the # target triple. @@ -556,14 +559,17 @@ which are required to run programs compiled with the GNAT. %patch70 -p0 -b .pr33962~ %patch71 -p0 -b .pr34070~ %patch72 -p0 -b .pr34089~ -%patch73 -p0 -b .pr34094~ +%patch73 -p0 -b .pr34178~ %patch74 -p0 -b .pr34130~ %patch75 -p0 -b .pr34146~ %patch76 -p0 -b .rh364001~ %patch77 -p0 -b .pr34213~ -%patch78 -p0 -b .pr34238~ +%patch78 -p0 -b .pr34364~ %patch79 -p0 -b .pr34275~ %patch80 -p0 -b .rh407281~ +%patch81 -p0 -b .pr34394~ +%patch82 -p0 -b .debug-fortran-array~ +%patch83 -p0 -b .omp-outer-ctx~ %if %{bootstrap_java} tar xjf %{SOURCE10} @@ -1736,6 +1742,15 @@ fi %doc rpm.doc/changelogs/libmudflap/ChangeLog* %changelog +* Wed Dec 12 2007 Jakub Jelinek 4.1.2-36 +- revert PR c++/34094 fix altogether, it was only accepts-invalid and + caused a bunch of valid or unclear cases to be rejected (#411871, #402521) +- fix OpenMP handling of global vars privatized in orphaned constructs + with #pragma omp parallel inside them +- -frepo fixes (#411741, PRs c++/34178, c++/34340) +- fix dynamic_cast in templates (PR c++/34364) +- fix error diagnostics involving ABS_EXPR (PR c++/34394) + * Sun Dec 2 2007 Jakub Jelinek 4.1.2-35 - two ctor preevaluation fixes (Olivier Hainque, Eric Botcazou, #407281)