summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/gomp
diff options
context:
space:
mode:
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-18 19:21:25 +0000
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-18 19:21:25 +0000
commit1e8e992020adfba209ef30b3c369e2ca6282d837 (patch)
treeb7647b4100a528e9911385ca6d0d57a23899ae2c /gcc/testsuite/gcc.dg/gomp
parent14efb9b7b52e816aa93ea4a451b5c10eb7634a8b (diff)
downloadgcc-1e8e992020adfba209ef30b3c369e2ca6282d837.tar.gz
2006-01-18 Richard Henderson <rth@redhat.com>
Jakub Jelinek <jakub@redhat.com> Diego Novillo <dnovillo@redhat.com> * libgomp: New directory. * Makefile.def: Add target_module libgomp. * Makefile.in: Regenerate. * configure.in (target_libraries): Add target-libgomp. * configure: Regenerate. contrib/ 2006-01-18 Richard Henderson <rth@redhat.com> Diego Novillo <dnovillo@redhat.com> * gcc_update (files_and_dependencies): Add libgomp files. gcc/ 2006-01-18 Richard Henderson <rth@redhat.com> Aldy Hernandez <aldyh@redhat.com> Jakub Jelinek <jakub@redhat.com> Diego Novillo <dnovillo@redhat.com> * omp-low.c: New file. * c-omp.c: New file. 2006-01-18 Richard Henderson <rth@redhat.com> Jakub Jelinek <jakub@redhat.com> Diego Novillo <dnovillo@redhat.com> * doc/invoke.texi: Document -fopenmp. * tree-dump.h (debug_function): Declare. * hooks.c (hook_bool_tree_bool_false): New function. (hook_tree_tree_null): Remove. (hook_tree_tree_tree_null): New. * hooks.h: Update to match. * tree-pretty-print.c (debug_tree_chain): New. (print_generic_expr): Handle TDF_CHAIN. (dump_generic_node): Handle BLOCK. Do not abort with incomplete SWITCH_EXPRs. Do not dump body of an OpenMP directive if TDF_SLIM is given. <case OMP_PARALLEL, OMP_FOR, OMP_SECTIONS>: Don't print space after directive name. <OMP_FOR>: Handle printing OMP_FOR_PRE_BODY. Handle OMP_MASTER and OMP_ORDERED. Handle printing of OMP_BODY just in one place, goto dump_omp_body in the rest of OMP_* nodes that have OMP_BODY. Don't handle clause nodes here. Update omp statements to use dump_omp_clauses. Handle OMP_SINGLE, OMP_SECTIONS, OMP_SECTION, OMP_CLAUSE_ORDERED, OMP_CLAUSE_SCHEDULE, OMP_ATOMIC, OMP_CRITICAL, OMP_CLAUSE_NOWAIT, GOMP_CLAUSE_IF, GOMP_CLAUSE_NUM_THREADS, GOMP_FOR, GOMP_CLAUSE_SHARED, GOMP_CLAUSE_FIRSTPRIVATE, GOMP_CLAUSE_LASTPRIVATE, GOMP_CLAUSE_COPYIN and GOMP_CLAUSE_COPYPRIVATE. Adjust output for GOMP_PARALLEL. (dump_omp_clauses): New. (print_declaration): Dump DECL_VALUE_EXPR. (op_symbol_1): Split out of op_symbol. (dumping_stmts): Remove. Update all users. * cgraph.c (cgraph_analyze_queue): New. (cgraph_add_new_function): New. * cgraph.h (cgraph_analyze_queue): Declare. (cgraph_add_new_function): Declare. (cgraph_lower_function): Remove. * tree.c (walk_tree): Walk OMP_CLAUSE_CHAIN of OMP_CLAUSE_* nodes. Use switch for all nodes, handle most of IS_EXPR_CODE_CLASS and TYPE_P nodes in its default clause. (empty_body_p): New. (tree_range_check_failed): New. (build5_stat): New. * tree.h (OMP_CLAUSE_REDUCTION_INIT, OMP_CLAUSE_REDUCTION_MERGE, OMP_CLAUSE_REDUCTION_PLACEHOLDER, OMP_CLAUSE_PRIVATE_DEBUG, OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE, OMP_FOR_PRE_BODY, OMP_MASTER_BODY, OMP_ORDERED_BODY OMP_BODY, OMP_CLAUSES, OMP_CLAUSE_DECL, OMP_CLAUSE_DEFAULT_KIND, OMP_CLAUSE_CHAIN, OMP_CLAUSE_OUTER_DECL, OMP_CLAUSE_INNER_DECL, OMP_CLAUSE_NUM_THREADS_EXPR, OMP_CLAUSE_IF_EXPR, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR, OMP_CLAUSE_SCHEDULE_CHUNK_SIZE. OMP_PARALLEL_VAR_INIT, OMP_PARALLEL_VAR_REDUC, OMP_FOR_VAR_INIT, OMP_FOR_VAR_LAST, OMP_FOR_VAR_REDUC, OMP_SECTIONS_VAR_INIT, OMP_SECTIONS_VAR_LAST, OMP_SECTIONS_VAR_REDUC, OMP_CLAUSE_REDUCTION_CODE OMP_SINGLE_CLAUSES, OMP_SINGLE_BODY, OMP_CLAUSE_SCHEDULE_CHUNK_SIZE, OMP_SECTION_BODY, OMP_CRITICAL_NAME, OMP_CRITICAL_BODY): New. (TREE_RANGE_CHECK): New. (empty_body_p): Declare. (enum omp_clause_default_kind): New. (build_string_literal): Declare. (enum omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_KIND): New. (build5_stat, build5): Declare. * tree-pass.h (TDF_CHAIN): Define. * tree-pass.h (PROP_gimple_lomp): Define. (pass_lower_omp): Declare. * diagnostic.h (debug_tree_chain): Declare. * builtins.c (get_builtin_sync_mode): Use 0 as last argument to mode_for_size. (expand_builtin): Handle sync BUILT_IN_*_16 builtins. * builtins.c (build_string_literal): Make extern. * gcc.c (include_spec_function): New. (static_spec_functions): Add it. (main): Move load of libgomp.spec ... (LINK_COMMAND_SPEC): ... here. (link_gomp_spec): New. (static_specs): Include it. (LINK_COMMAND_SPEC): Add link_gomp. (GOMP_SELF_SPECS): New. (driver_self_specs): Include it. (switch_matches): Don't mark inline. (main): Load libgomp.spec. * tree-gimple.c (is_gimple_stmt): True for OMP_MASTER, OMP_ORDERED, OMP_CRITICAL, OMP_SECTIONS, OMP_SECTION, and OMP_SINGLE, OMP_FOR and OMP_PARALLEL. * tree-gimple.h (enum omp_parallel): Declare. (determine_parallel_type): Declare. (omp_firstprivatize_variable): Declare. (omp_reduction_init): Declare. (diagnose_omp_structured_block_errors): Declare. (struct walk_stmt_info): Add want_return_expr. (struct walk_stmt_info): Add want_bind_expr, want_locations. (find_omp_clause): Declare. (insert_field_into_struct): Declare. (struct walk_stmt_info): Move from tree-nested.c (walk_stmts): Declare. * c-cppbuiltin.c (c_cpp_builtins): If -fopenmp, #define _OPENMP to 200505. * cgraphunit.c (cgraph_lower_function): Make static. (cgraph_finalize_pending_functions): New. (cgraph_finalize_function): Call it. (cgraph_finalize_compilation_unit): Likewise. * builtin-types.def (BT_I16, BT_FN_I16_VPTR_I16, BT_FN_BOOL_VPTR_I16_I16, BT_FN_I16_VPTR_I16_I16): Add. (BT_FN_UINT_UINT): New. (DEF_FUNCTION_TYPE_6, DEF_FUNCTION_TYPE_7, DEF_FUNCTION_TYPE_VAR_4): Document. (BT_PTR_LONG, BT_PTR_PTR, BT_FN_BOOL, BT_FN_INT, BT_FN_VOID_PTRPTR, BT_PTR_FN_VOID_PTR, BT_FN_BOOL_LONGPTR_LONGPTR, BT_FN_VOID_OMPFN_PTR_UINT, BT_FN_VOID_OMPFN_PTR_UINT_UINT, BT_FN_BOOL_LONG_LONG_LONG_LONGPTR_LONGPTR, BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR, BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG, BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG): New. * builtins.def: Update DEF_BUILTIN comment to include COND argument. Move all DEF_SYNC_BUILTIN () and DEF_GOMP_BUILTIN () builtins into separate files. (DEF_GOMP_BUILTIN): New. (BUILT_IN_OMP_GET_THREAD_NUM, BUILT_IN_GOMP_BARRIER, BUILT_IN_GOMP_CRITICAL_START, BUILT_IN_GOMP_CRITICAL_END, BUILT_IN_GOMP_CRITICAL_NAME_START, BUILT_IN_GOMP_CRITICAL_NAME_END, BUILT_IN_GOMP_LOOP_STATIC_START, BUILT_IN_GOMP_LOOP_DYNAMIC_START, BUILT_IN_GOMP_LOOP_GUIDED_START, BUILT_IN_GOMP_LOOP_RUNTIME_START, BUILT_IN_GOMP_LOOP_ORDERED_STATIC_START, BUILT_IN_GOMP_LOOP_ORDERED_DYNAMIC_START, BUILT_IN_GOMP_LOOP_ORDERED_GUIDED_START, BUILT_IN_GOMP_LOOP_ORDERED_RUNTIME_START, BUILT_IN_GOMP_LOOP_STATIC_NEXT, BUILT_IN_GOMP_LOOP_DYNAMIC_NEXT, BUILT_IN_GOMP_LOOP_GUIDED_NEXT, BUILT_IN_GOMP_LOOP_RUNTIME_NEXT, BUILT_IN_GOMP_LOOP_ORDERED_STATIC_NEXT, BUILT_IN_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, BUILT_IN_GOMP_LOOP_ORDERED_GUIDED_NEXT, BUILT_IN_GOMP_LOOP_ORDERED_RUNTIME_NEXT, BUILT_IN_GOMP_PARALLEL_LOOP_STATIC_START, BUILT_IN_GOMP_PARALLEL_LOOP_DYNAMIC_START, BUILT_IN_GOMP_PARALLEL_LOOP_GUIDED_START, BUILT_IN_GOMP_PARALLEL_LOOP_RUNTIME_START, BUILT_IN_GOMP_LOOP_END, BUILT_IN_GOMP_LOOP_END_NOWAIT, BUILT_IN_GOMP_ORDERED_START, BUILT_IN_GOMP_ORDERED_END, BUILT_IN_GOMP_PARALLEL_START, BUILT_IN_GOMP_PARALLEL_END, BUILT_IN_GOMP_SECTIONS_START, BUILT_IN_GOMP_SECTIONS_NEXT, BUILT_IN_GOMP_PARALLEL_SECTIONS_START, BUILT_IN_GOMP_SECTIONS_END, BUILT_IN_GOMP_SECTIONS_END_NOWAIT, BUILT_IN_GOMP_SINGLE_START, BUILT_IN_GOMP_SINGLE_COPY_START, BUILT_IN_GOMP_SINGLE_COPY_END): New. * sync-builtins.def: New file, moved from builtins.def. * omp-builtins.def: New file, moved from builtins.def. * c-objc-common.h (LANG_HOOKS_OMP_PREDETERMINED_SHARING): Redefine. * gimple-low.c (lower_function_body): Clear data. (lower_stmt): Do not handle COMPOUND_EXPR. Remove call to print_node_brief. * c-tree.h (c_finish_omp_clauses): New prototype. (C_DECL_THREADPRIVATE_P): Define. (lookup_name_no_remap, c_omp_remap_private): Remove (c_begin_omp_parallel, c_finish_omp_parallel): Update. (check_for_loop_decls): Update decl. (lookup_name_no_remap, c_omp_remap_private): Declare. (build_indirect_ref, build_modify_expr, pushdecl, pushdecl_top_level): Move to c-common.h. * dwarf2out.c (loc_descriptor_from_tree_1): Don't set unsignedp before the switch, but just in the 2 places that need it. * c-decl.c (diagnose_mismatched_decls): Do not check for mismatched thread-local attributes when OLDDECL is marked threadprivate and NEWDECL has no thread-local attributes. (merge_decls): Merge C_DECL_THREADPRIVATE_P. (c_gimple_diagnostics_recursively): Rename from c_warn_unused_result_recursively. Invoke diagnose_omp_structured_block_errors. (check_for_loop_decls): Return a singular decl found. * langhooks.c (lhd_omp_predetermined_sharing): Return OMP_CLAUSE_DEFAULT_SHARED for DECL_ARTIFICIAL decls. (lhd_omp_firstprivatize_type_sizes): New. (lhd_omp_assignment): New. (lhd_omp_predetermined_sharing): New. * langhooks.h (struct gimplify_omp_ctx): Forward declare. (struct lang_hooks_for_types): Add omp_firstprivatize_type_sizes, omp_privatize_by_reference, omp_predetermined_sharing, omp_disregard_value_expr, omp_private_debug_clause, omp_clause_default_ctor, omp_clause_copy_ctor, omp_clause_assign_op, omp_clause_dtor. (c_finish_omp_clauses): New. (c_finish_bc_stmt): Diagnose break within omp for. (c_begin_omp_parallel, c_finish_omp_parallel): New. (build_unary_op): Return error_mark after reporting a readonly_error. (build_modify_expr): Likewise. * gimplify.c: Include optabs.h and pointer-set.h. (enum gimplify_omp_var_data): Declare. (struct gimplify_omp_ctx): Declare. (struct gimplify_ctx): Add fields prev_context, combined_pre_p and combined_ctxp. (gimplify_ctxp, gimplify_omp_ctxp): New local variables. (push_gimplify_context, pop_gimplify_context): Allow nesting. (splay_tree_compare_decl_uid): New. (new_omp_context): New. (delete_omp_context): New. (gimple_add_tmp_var): Call omp_add_variable. (gimplify_bind_expr): Likewise. (gimplify_var_or_parm_decl): If omp_notice_variable returned true, disregard DECL_VALUE_EXPR on the decl if any. (gimplify_expr_in_ctx): New. (omp_firstprivatize_variable, omp_firstprivatize_type_sizes omp_add_variable, omp_notice_variable, omp_is_private gimplify_scan_omp_clauses, gimplify_adjust_omp_clauses_1 gimplify_adjust_omp_clauses, gimplify_omp_parallel gimplify_omp_for, gimplify_omp_workshare, goa_lhs_expr_p gimplify_omp_atomic_fetch_op, goa_stabilize_expr gimplify_omp_atomic_pipeline, gimplify_omp_atomic_mutex gimplify_omp_atomic): New. (gimplify_expr): Handle OMP_PARALLEL, OMP_FOR, OMP_SECTIONS, OMP_SINGLE, OMP_SECTION, OMP_MASTER, OMP_ORDERED, OMP_CRITICAL and OMP_ATOMIC. (gimplify_body): Verify gimplify_ctxp is empty after gimplification. * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_ATOMIC, PRAGMA_OMP_BARRIER, PRAGMA_OMP_CRITICAL, PRAGMA_OMP_FLUSH, PRAGMA_OMP_FOR, PRAGMA_OMP_MASTER, PRAGMA_OMP_ORDERED, PRAGMA_OMP_PARALLEL, PRAGMA_OMP_PARALLEL_FOR, PRAGMA_OMP_PARALLEL_SECTIONS, PRAGMA_OMP_SECTION, PRAGMA_OMP_SECTIONS, PRAGMA_OMP_SINGLE, PRAGMA_OMP_THREADPRIVATE. * tree.def (OMP_PARALLEL, OMP_FOR, OMP_SECTIONS, OMP_SINGLE, OMP_SECTION, OMP_MASTER, OMP_ORDERED, OMP_CRITICAL, OMP_ATOMIC, OMP_CLAUSE_PRIVATE, OMP_CLAUSE_SHARED, OMP_CLAUSE_FIRSTPRIVATE, OMP_CLAUSE_LASTPRIVATE, OMP_CLAUSE_REDUCTION, OMP_CLAUSE_COPYIN, OMP_CLAUSE_COPYPRIVATE, OMP_CLAUSE_IF, OMP_CLAUSE_NUM_THREADS, OMP_CLAUSE_SCHEDULE, OMP_CLAUSE_NOWAIT, OMP_CLAUSE_ORDERED, OMP_CLAUSE_DEFAULT): Define. * print-tree.c (print_node): Dump DECL_VALUE_EXPR. * tree-ssa-dce.c (find_control_dependence): Do not assume that ENTRY_BLOCK_PTR->next_bb == single_succ (ENTRY_BLOCK_PTR). * tree-nested.c (convert_call_expr): Call walk_body on OMP_BODY for OpenMP directives. (struct nesting_info): Add field_map, suppress_expansion, debug_var_chain. (create_nesting_tree): Initialize them. (lookup_field_for_decl): Use field_map. (get_nonlocal_debug_decl, get_local_debug_decl): New. (convert_local_omp_clauses): New. (finalize_nesting_tree_1): Add debug_var_chain to toplevel block. (walk_body): Split out of walk_function. (convert_nonlocal_omp_clauses, convert_local_omp_clauses): New. (convert_nonlocal_reference): Handle omp statements. (convert_local_reference): Likewise. (unnest_nesting_tree_1): Split out of finalize_nesting_tree_1. (unnest_nesting_tree): New. (lower_nested_functions): Call it. (insert_field_into_struct): Make extern. (struct walk_stmt_info): Move to tree-gimple.h. (walk_stmts): Make extern. * omp-builtins.def: New file. * tree-iterator.c (expr_only): Clarify comment. * c-common.h (pushdecl_top_level, pushdecl, build_modify_expr, build_indirect_ref, c_finish_omp_master, c_finish_omp_critical, c_finish_omp_ordered, c_finish_omp_barrier, c_finish_omp_atomic, c_finish_omp_flush, c_finish_omp_for, c_split_parallel_clauses, omp_clause_default_kind, c_omp_sharing_predetermined, c_omp_remap_decl): Declare. * Makefile.in (BUILTINS_DEF): Add omp-builtins.def. (OBJS-common): Add omp-low.o. (c-omp.o, omp-low.o): Add. (gimplify.o): Add dependency on $(OPTABS_H). (GTFILES): Add omp-low.c. (gt-stringpool.h): Add. * tree-cfg.c (set_bb_for_stmt): Do not update the block-to-labels map if we are currently expanding to RTL. (tree_node_can_be_shared): Remove unnecessary CONSTANT_CLASS_P checks. Handle IDENTIFIER_NODE. (tree_verify_flow_info): Do not ICE when emitting error messages about invalid labels. (dump_function_to_file): Reset CFUN before emitting the body of the function. (debug_function): New. * passes.c (init_optimization_passes): Schedule pass_lower_omp. * langhooks-def.h (lhd_omp_predetermined_sharing, lhd_omp_assignment, lhd_omp_firstprivatize_type_sizes): Declare. (LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES): Define. (LANG_HOOKS_FOR_TYPES_INITIALIZER): Use it. (LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE, LANG_HOOKS_OMP_PREDETERMINED_SHARING, LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR, LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE, LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR, LANG_HOOKS_OMP_CLAUSE_COPY_CTOR, LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP, LANG_HOOKS_OMP_CLAUSE_DTOR): Define. (LANG_HOOK_DECLS): Use them. 2006-01-18 Dmitry Kurochkin <dmitry.kurochkin@gmail.com> Richard Henderson <rth@redhat.com> Jakub Jelinek <jakub@redhat.com> Diego Novillo <dnovillo@redhat.com> * c-parser.c (pragma_omp_clause): Define. (c_parser_declaration_or_fndef): Document OpenMP syntax. (c_parser_compound_statement): Likewise. (c_parser_statement): Likewise. (c_parser_pragma): Handle omp pragmas. (OMP_FOR_CLAUSE_MASK, OMP_SECTIONS_CLAUSE_MASK, OMP_PARALLEL_CLAUSE_MASK, OMP_SINGLE_CLAUSE_MASK): Define. (c_parser_omp_clause_name, check_no_duplicate_clause, c_parser_omp_variable_list, c_parser_omp_var_list_parens, c_parser_omp_clause_copyin, c_parser_omp_clause_copyprivate, c_parser_omp_clause_default, c_parser_omp_clause_firstprivate, c_parser_omp_clause_if, c_parser_omp_clause_lastprivate, c_parser_omp_clause_nowait, c_parser_omp_clause_num_threads, c_parser_omp_clause_ordered, c_parser_omp_clause_private, c_parser_omp_clause_reduction, c_parser_omp_clause_schedule, c_parser_omp_clause_shared, c_parser_omp_all_clauses, c_parser_omp_structured_block, c_parser_omp_atomic, c_parser_omp_barrier, c_parser_omp_critical, c_parser_omp_flush, c_parser_omp_for_loop, c_parser_omp_for, c_parser_omp_master, c_parser_omp_ordered, c_parser_omp_sections_scope, c_parser_omp_sections, c_parser_omp_parallel, c_parser_omp_single, c_parser_omp_construct, c_parser_omp_threadprivate): New. * c-pragma.c (init_pragma): Do omp pragma registration here. * c.opt (fopenmp): New flag. 2006-01-18 Eric Christopher <echristo@apple.com> * gcc.c (GOMP_SELF_SPECS): Bracket in #ifndef/#endif. * config/darwin.h (GOMP_SELF_SPECS): Define. testsuite/ 2006-01-18 Richard Henderson <rth@redhat.com> Aldy Hernandez <aldyh@redhat.com> Jakub Jelinek <jakub@redhat.com> Diego Novillo <dnovillo@redhat.com> Uros Bizjak <uros@kss-loka.si> * testsuite/gcc.dg/gomp: New directory. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109902 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/gcc.dg/gomp')
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c41
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c35
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c26
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c29
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c16
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-1.c99
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-2.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-3.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-4.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-5.c38
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-6.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-7.c23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-8.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/atomic-9.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/barrier-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/barrier-2.c26
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-1.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-10.c40
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-11.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-2.c32
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-3.c57
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-4.c9
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-5.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-6.c9
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-7.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-8.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/block-9.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/clause-1.c94
-rw-r--r--gcc/testsuite/gcc.dg/gomp/copyin-1.c27
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-1.c28
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-2.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-3.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/empty.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/flush-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/flush-2.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-1.c48
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-10.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-11.c73
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-12.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-13.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-14.c19
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-15.c12
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-16.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-17.c67
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-18.c42
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-19.c21
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-2.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-3.c62
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-4.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-5.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-6.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-7.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-8.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/for-9.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/gomp.exp14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-2.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/master-1.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/master-2.c7
-rw-r--r--gcc/testsuite/gcc.dg/gomp/master-3.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/num-threads-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c24
-rw-r--r--gcc/testsuite/gcc.dg/gomp/ordered-1.c20
-rw-r--r--gcc/testsuite/gcc.dg/gomp/ordered-2.c7
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-1.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-2.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-3.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/parallel-4.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-1.c39
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-2.c29
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-3.c15
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sections-4.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sharing-1.c58
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sharing-2.c25
-rw-r--r--gcc/testsuite/gcc.dg/gomp/sharing-3.c17
-rw-r--r--gcc/testsuite/gcc.dg/gomp/static.c14
-rw-r--r--gcc/testsuite/gcc.dg/gomp/tls-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/gomp/tls-2.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/uninit-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-1.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-2.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-3.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-4.c11
-rw-r--r--gcc/testsuite/gcc.dg/gomp/vla-5.c11
113 files changed, 2515 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c
new file mode 100644
index 00000000000..f7f2924ce1a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.1.1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+void
+a1 (int n, float *a, float *b)
+{
+ int i;
+#pragma omp parallel for
+ for (i = 1; i < n; i++) /* i is private by default */
+ b[i] = (a[i] + a[i - 1]) / 2.0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c
new file mode 100644
index 00000000000..750bc378c64
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.10.1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+void
+work1 ()
+{
+}
+
+void
+work2 ()
+{
+}
+void
+a10 ()
+{
+#pragma omp parallel
+ {
+#pragma omp single
+ printf ("Beginning work1.\n");
+ work1 ();
+#pragma omp single
+ printf ("Finishing work1.\n");
+#pragma omp single nowait
+ printf ("Finished work1 and beginning work2.\n");
+ work2 ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c
new file mode 100644
index 00000000000..fab948dd736
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.12.1.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+extern float average (float, float, float);
+void
+a12 (float *x, float *xold, int n, float tol)
+{
+ int c, i, toobig;
+ float error, y;
+ c = 0;
+#pragma omp parallel
+ {
+ do
+ {
+#pragma omp for private(i)
+ for (i = 1; i < n - 1; ++i)
+ {
+ xold[i] = x[i];
+ }
+#pragma omp single
+ {
+ toobig = 0;
+ }
+#pragma omp for private(i,y,error) reduction(+:toobig)
+ for (i = 1; i < n - 1; ++i)
+ {
+ y = x[i];
+ x[i] = average (xold[i - 1], x[i], xold[i + 1]);
+ error = y - x[i];
+ if (error > tol || error < -tol)
+ ++toobig;
+ }
+#pragma omp master
+ {
+ ++c;
+ printf ("iteration %d, toobig=%d\n", c, toobig);
+ }
+ }
+ while (toobig > 0);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c
new file mode 100644
index 00000000000..cc0fcc25d79
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.13.1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+int dequeue (float *a);
+void work (int i, float *a);
+void
+a13 (float *x, float *y)
+{
+ int ix_next, iy_next;
+#pragma omp parallel shared(x, y) private(ix_next, iy_next)
+ {
+#pragma omp critical (xaxis)
+ ix_next = dequeue (x);
+ work (ix_next, x);
+#pragma omp critical (yaxis)
+ iy_next = dequeue (y);
+ work (iy_next, y);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c
new file mode 100644
index 00000000000..14a7ed0bde6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.14.1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+void
+a14 ()
+{
+ int i = 1;
+#pragma omp parallel sections
+ {
+#pragma omp section
+ {
+#pragma omp critical (name)
+ {
+#pragma omp parallel
+ {
+#pragma omp single
+ {
+ i++;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c
new file mode 100644
index 00000000000..c460f7566ef
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+void
+a17_1_wrong ()
+{
+ union
+ {
+ int n;
+ float x;
+ } u;
+#pragma omp parallel
+ {
+#pragma omp atomic
+ u.n++;
+#pragma omp atomic
+ u.x += 1.0;
+/* Incorrect because the atomic constructs reference the same location
+ through incompatible types */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c
new file mode 100644
index 00000000000..aaaec7ea351
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.17.2.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+void
+a17_2_wrong ()
+{
+ int x;
+ int *i;
+ float *r;
+ i = &x;
+ r = (float *) &x;
+#pragma omp parallel
+ {
+#pragma omp atomic
+ *i += 1;
+#pragma omp atomic
+ *r += 1.0;
+/* Incorrect because the atomic constructs reference the same location
+ through incompatible types */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c
new file mode 100644
index 00000000000..d43e0cf45f5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+a20_wrong ()
+{
+ int a = 1;
+#pragma omp parallel
+ {
+ if (a != 0)
+#pragma omp flush(a) /* { dg-error "'#pragma omp flush' may only" } */
+/* incorrect as flush cannot be immediate substatement
+ of if statement */
+ if (a != 0)
+#pragma omp barrier /* { dg-error "'#pragma omp barrier' may only" } */
+/* incorrect as barrier cannot be immediate substatement
+ of if statement */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c
new file mode 100644
index 00000000000..4f113835624
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.20.2.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+a20 ()
+{
+ int a = 1;
+#pragma omp parallel
+ {
+ if (a != 0)
+ {
+#pragma omp flush(a)
+ }
+ if (a != 0)
+ {
+#pragma omp barrier
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c
new file mode 100644
index 00000000000..a9b81d0c399
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.2.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+void
+work (int i)
+{
+}
+
+void
+a21_wrong (int n)
+{
+ int i;
+#pragma omp for ordered
+ for (i = 0; i < n; i++)
+ {
+/* incorrect because an iteration may not execute more than one
+ ordered region */
+#pragma omp ordered
+ work (i);
+#pragma omp ordered
+ work (i + 1);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c
new file mode 100644
index 00000000000..4d1ed6a5286
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.21.3.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+void work (int);
+
+void
+a21_good (int n)
+{
+ int i;
+#pragma omp for ordered
+ for (i = 0; i < n; i++)
+ {
+ if (i <= 10)
+ {
+#pragma omp ordered
+ work (i);
+ }
+ if (i > 10)
+ {
+#pragma omp ordered
+ work (i + 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c
new file mode 100644
index 00000000000..e3586838a34
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+int counter = 0;
+#pragma omp threadprivate(counter)
+int
+increment_counter ()
+{
+ counter++;
+ return (counter);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c
new file mode 100644
index 00000000000..7a6e901a8c7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.22.2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+int
+increment_counter_2 ()
+{
+ static int counter = 0;
+#pragma omp threadprivate(counter)
+ counter++;
+ return (counter);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c
new file mode 100644
index 00000000000..9d8baa37f23
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.24.1.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+extern int omp_get_num_threads (void);
+int x, y, t, z[1000];
+#pragma omp threadprivate(x)
+void
+a24 (int a)
+{
+ const int c = 1;
+ int i = 0;
+ int l = 0;
+#pragma omp parallel default(none) private(a) shared(z)
+ {
+ int j = omp_get_num_threads ();
+ /* O.K. - j is declared within parallel region */
+ /* O.K. - a is listed in private clause */
+ /* - z is listed in shared clause */
+ x = c; /* O.K. - x is threadprivate */
+ /* - c has const-qualified type */
+ z[i] = y;
+ /* { dg-error "'i' not specified" "" { target *-*-* } 21 } */
+ /* { dg-error "enclosing parallel" "" { target *-*-* } 13 } */
+ /* { dg-error "'y' not specified" "" { target *-*-* } 21 } */
+#pragma omp for firstprivate(y)
+ for (i = 0; i < 10; i++)
+ {
+ z[i] = y; /* O.K. - i is the loop iteration variable */
+ /* - y is listed in firstprivate clause */
+ }
+ z[l] = t;
+ /* { dg-error "'l' not specified" "" { target *-*-* } 31 } */
+ /* { dg-error "'t' not specified" "" { target *-*-* } 31 } */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c
new file mode 100644
index 00000000000..b655edc107c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.26.2.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -std=c99" } */
+
+int a;
+void
+g (int k)
+{
+ a = k; /* The global "a", not the private "a" in f */
+}
+
+void
+f (int n)
+{
+ int a = 0;
+#pragma omp parallel for private(a)
+ for (int i = 1; i < n; i++)
+ {
+ a = i;
+ g (a * 2); /* Private copy of "a" */
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c
new file mode 100644
index 00000000000..faa6ac62128
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.27.1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+void
+a27 ()
+{
+ int i, a;
+#pragma omp parallel private(a)
+ {
+#pragma omp parallel for private(a)
+ for (i = 0; i < 10; i++)
+ {
+ /* do work here */
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c
new file mode 100644
index 00000000000..e34be4c4296
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.30.1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void
+a30 (int n, float *a, float *b)
+{
+ int i;
+#pragma omp parallel
+ {
+#pragma omp for lastprivate(i)
+ for (i = 0; i < n - 1; i++)
+ a[i] = b[i] + b[i + 1];
+ }
+ a[i] = b[i]; /* i == n-1 here */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c
new file mode 100644
index 00000000000..cbb3f60df44
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+void
+a31_1 (float *x, int *y, int n)
+{
+ int i, b;
+ float a;
+ a = 0.0;
+ b = 0;
+#pragma omp parallel for private(i) shared(x, y, n) \
+ reduction(+:a) reduction(^:b)
+ for (i = 0; i < n; i++)
+ {
+ a += x[i];
+ b ^= y[i];
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c
new file mode 100644
index 00000000000..f9da3f4fc20
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.31.2.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+void
+a31_2 (float *x, int *y, int n)
+{
+ int i, b, b_p;
+ float a, a_p;
+ a = 0.0;
+ b = 0;
+#pragma omp parallel shared(a, b, x, y, n) \
+ private(a_p, b_p)
+ {
+ a_p = 0.0;
+ b_p = 0;
+#pragma omp for private(i)
+ for (i = 0; i < n; i++)
+ {
+ a_p += x[i];
+ b_p ^= y[i];
+ }
+#pragma omp critical
+ {
+ a += a_p;
+ b ^= b_p;
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c
new file mode 100644
index 00000000000..d2cb316f3cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.32.1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#include <stdlib.h>
+float *work;
+int size;
+float tol;
+void build (void);
+#pragma omp threadprivate(work,size,tol)
+void
+a32 (float t, int n)
+{
+ tol = t;
+ size = n;
+#pragma omp parallel copyin(tol,size)
+ {
+ build ();
+ }
+}
+void
+build ()
+{
+ int i;
+ work = (float *) malloc (sizeof (float) * size);
+ for (i = 0; i < size; ++i)
+ work[i] = tol;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c
new file mode 100644
index 00000000000..99c06da6a5d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#include <stdio.h>
+float x, y;
+#pragma omp threadprivate(x, y)
+void
+init (float a, float b)
+{
+#pragma omp single copyprivate(a,b,x,y)
+ {
+ scanf ("%f %f %f %f", &a, &b, &x, &y);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c
new file mode 100644
index 00000000000..a0da739dd84
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.33.2.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+#include <stdio.h>
+#include <stdlib.h>
+float
+read_next ()
+{
+ float *tmp;
+ float return_val;
+#pragma omp single copyprivate(tmp)
+ {
+ tmp = (float *) malloc (sizeof (float));
+ } /* copies the pointer only */
+#pragma omp master
+ {
+ scanf ("%f", tmp);
+ }
+#pragma omp barrier
+ return_val = *tmp;
+#pragma omp barrier
+#pragma omp single nowait
+ {
+ free (tmp);
+ }
+ return return_val;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c
new file mode 100644
index 00000000000..e5ae7a61efc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+void
+work (int i, int j)
+{
+}
+
+void
+good_nesting (int n)
+{
+ int i, j;
+#pragma omp parallel default(shared)
+ {
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+#pragma omp parallel shared(i, n)
+ {
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c
new file mode 100644
index 00000000000..7cc265fec02
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.34.2.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+
+void
+work (int i, int j)
+{
+}
+
+void
+work1 (int i, int n)
+{
+ int j;
+#pragma omp parallel default(shared)
+ {
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+ }
+}
+void
+good_nesting2 (int n)
+{
+ int i;
+#pragma omp parallel default(shared)
+ {
+#pragma omp for
+ for (i = 0; i < n; i++)
+ work1 (i, n);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
new file mode 100644
index 00000000000..95556c948c7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+void
+work (int i, int j)
+{
+}
+
+void
+wrong1 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i, j;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+ /* incorrect nesting of loop regions */
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c
new file mode 100644
index 00000000000..165c86e278f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.2.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+void work (int, int);
+
+void
+work1 (int i, int n)
+{
+ int j;
+ /* incorrect nesting of loop regions */
+#pragma omp for
+ for (j = 0; j < n; j++)
+ work (i, j);
+}
+
+void
+wrong2 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ work1 (i, n);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
new file mode 100644
index 00000000000..f99e09b36c5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+void work (int, int);
+
+void
+wrong3 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+/* incorrect nesting of regions */
+#pragma omp single
+ work (i, 0);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c
new file mode 100644
index 00000000000..88824031cc2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+wrong4 (int n)
+{
+#pragma omp parallel default(shared)
+ {
+ int i;
+#pragma omp for
+ for (i = 0; i < n; i++)
+ {
+ work (i, 0);
+ /* incorrect nesting of barrier region in a loop region */
+#pragma omp barrier
+ work (i, 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c
new file mode 100644
index 00000000000..7b53015571e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+void
+wrong5 (int n)
+{
+#pragma omp parallel
+ {
+#pragma omp critical
+ {
+ work (n, 0);
+/* incorrect nesting of barrier region in a critical region */
+#pragma omp barrier
+ work (n, 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c
new file mode 100644
index 00000000000..6385db30897
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+void
+wrong6 (int n)
+{
+#pragma omp parallel
+ {
+#pragma omp single
+ {
+ work (n, 0);
+/* incorrect nesting of barrier region in a single region */
+#pragma omp barrier
+ work (n, 1);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c
new file mode 100644
index 00000000000..3581ee27d7d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+extern int omp_get_num_threads (void);
+void work (int i);
+void
+incorrect ()
+{
+ int np, i;
+ np = omp_get_num_threads (); /* misplaced */
+#pragma omp parallel for schedule(static)
+ for (i = 0; i < np; i++)
+ work (i);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c
new file mode 100644
index 00000000000..64256c78d88
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.37.2.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+extern int omp_get_thread_num (void);
+void work (int i);
+void
+correct ()
+{
+ int i;
+#pragma omp parallel private(i)
+ {
+ i = omp_get_thread_num ();
+ work (i);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c
new file mode 100644
index 00000000000..eed21b367cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.8.1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+#include <math.h>
+void
+a8 (int n, int m, float *a, float *b, float *y, float *z)
+{
+ int i;
+#pragma omp parallel
+ {
+#pragma omp for nowait
+ for (i = 1; i < n; i++)
+ b[i] = (a[i] + a[i - 1]) / 2.0;
+#pragma omp for nowait
+ for (i = 0; i < m; i++)
+ y[i] = sqrt (z[i]);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c
new file mode 100644
index 00000000000..45be33f16ea
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.9.1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void XAXIS ();
+void YAXIS ();
+void ZAXIS ();
+void
+a9 ()
+{
+#pragma omp parallel sections
+ {
+#pragma omp section
+ XAXIS ();
+#pragma omp section
+ YAXIS ();
+#pragma omp section
+ ZAXIS ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-1.c b/gcc/testsuite/gcc.dg/gomp/atomic-1.c
new file mode 100644
index 00000000000..3e4bc569ba7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-1.c
@@ -0,0 +1,99 @@
+/* { dg-do compile } */
+
+int x;
+volatile int y;
+volatile unsigned char z;
+
+void f1(void)
+{
+ #pragma omp atomic
+ x++;
+ #pragma omp atomic
+ x--;
+ #pragma omp atomic
+ ++x;
+ #pragma omp atomic
+ --x;
+ #pragma omp atomic
+ x += 1;
+ #pragma omp atomic
+ x -= y;
+ #pragma omp atomic
+ x |= 1;
+ #pragma omp atomic
+ x &= 1;
+ #pragma omp atomic
+ x ^= 1;
+ #pragma omp atomic
+ x *= 3;
+ #pragma omp atomic
+ x /= 3;
+ #pragma omp atomic
+ x /= 3;
+ #pragma omp atomic
+ x <<= 3;
+ #pragma omp atomic
+ x >>= 3;
+}
+
+void f2(void)
+{
+ #pragma omp atomic
+ y++;
+ #pragma omp atomic
+ y--;
+ #pragma omp atomic
+ ++y;
+ #pragma omp atomic
+ --y;
+ #pragma omp atomic
+ y += 1;
+ #pragma omp atomic
+ y -= x;
+ #pragma omp atomic
+ y |= 1;
+ #pragma omp atomic
+ y &= 1;
+ #pragma omp atomic
+ y ^= 1;
+ #pragma omp atomic
+ y *= 3;
+ #pragma omp atomic
+ y /= 3;
+ #pragma omp atomic
+ y /= 3;
+ #pragma omp atomic
+ y <<= 3;
+ #pragma omp atomic
+ y >>= 3;
+}
+
+void f3(void)
+{
+ #pragma omp atomic
+ z++;
+ #pragma omp atomic
+ z--;
+ #pragma omp atomic
+ ++z;
+ #pragma omp atomic
+ --z;
+ #pragma omp atomic
+ z += 1;
+ #pragma omp atomic
+ z |= 1;
+ #pragma omp atomic
+ z &= 1;
+ #pragma omp atomic
+ z ^= 1;
+ #pragma omp atomic
+ z *= 3;
+ #pragma omp atomic
+ z /= 3;
+ #pragma omp atomic
+ z /= 3;
+ #pragma omp atomic
+ z <<= 3;
+ #pragma omp atomic
+ z >>= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-2.c b/gcc/testsuite/gcc.dg/gomp/atomic-2.c
new file mode 100644
index 00000000000..720ec9e8ba0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-2.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+float x, y;
+
+void f1(void)
+{
+ #pragma omp atomic
+ x++;
+ #pragma omp atomic
+ x--;
+ #pragma omp atomic
+ ++x;
+ #pragma omp atomic
+ --x;
+ #pragma omp atomic
+ x += 1;
+ #pragma omp atomic
+ x -= y;
+ #pragma omp atomic
+ x *= 3;
+ #pragma omp atomic
+ x /= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-3.c b/gcc/testsuite/gcc.dg/gomp/atomic-3.c
new file mode 100644
index 00000000000..0c612a16061
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-3.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+int *xyzzy;
+
+void f1(void)
+{
+ #pragma omp atomic
+ xyzzy++;
+}
+
+/* { dg-final { scan-tree-dump-times "xyzzy, 4" 1 "gimple" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-4.c b/gcc/testsuite/gcc.dg/gomp/atomic-4.c
new file mode 100644
index 00000000000..7f27370d535
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-4.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+int a[4];
+int *p;
+struct S { int x; int y[4]; } s;
+int *bar(void);
+
+void f1(void)
+{
+ #pragma omp atomic
+ a[4] += 1;
+ #pragma omp atomic
+ *p += 1;
+ #pragma omp atomic
+ s.x += 1;
+ #pragma omp atomic
+ s.y[*p] += 1;
+ #pragma omp atomic
+ s.y[*p] *= 42;
+ #pragma omp atomic
+ *bar() += 1;
+ #pragma omp atomic
+ *bar() *= 42;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-5.c b/gcc/testsuite/gcc.dg/gomp/atomic-5.c
new file mode 100644
index 00000000000..445f7805f70
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-5.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+
+int x;
+const int y;
+int bar(void);
+
+void f1(void)
+{
+ register int z;
+
+ #pragma omp atomic
+ x %= 2; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ x = x + 1; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ x = 1; /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ ++y; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ y--; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ y += 1; /* { dg-error "read-only variable" } */
+ #pragma omp atomic
+ z += 1; /* { dg-error "register variable" } */
+ #pragma omp atomic
+ bar(); /* { dg-error "invalid operator" } */
+ #pragma omp atomic
+ bar() += 1; /* { dg-error "lvalue required" } */
+ #pragma omp atomic a /* { dg-error "expected end of line" } */
+ x++;
+ #pragma omp atomic
+ ; /* { dg-error "expected expression" } */
+ #pragma omp atomic
+ #pragma omp atomic /* { dg-error "expected expression" } */
+ ;
+ /* Check that we didn't get stuck on the pragma eol marker. */
+ undef; /* { dg-error "" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-6.c b/gcc/testsuite/gcc.dg/gomp/atomic-6.c
new file mode 100644
index 00000000000..0d56becd85e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-6.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+int x[10], z;
+double y[10];
+
+void f1(void)
+{
+ #pragma omp atomic
+ x[z] /= y[z];
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-7.c b/gcc/testsuite/gcc.dg/gomp/atomic-7.c
new file mode 100644
index 00000000000..612e97f4530
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-7.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+double x, y;
+
+void f2(void)
+{
+ #pragma omp atomic
+ y++;
+ #pragma omp atomic
+ y--;
+ #pragma omp atomic
+ ++y;
+ #pragma omp atomic
+ --y;
+ #pragma omp atomic
+ y += 1;
+ #pragma omp atomic
+ y -= x;
+ #pragma omp atomic
+ y *= 3;
+ #pragma omp atomic
+ y /= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-8.c b/gcc/testsuite/gcc.dg/gomp/atomic-8.c
new file mode 100644
index 00000000000..2f04151f0ed
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-8.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+long double z;
+
+void f3(void)
+{
+ #pragma omp atomic
+ z++;
+ #pragma omp atomic
+ z--;
+ #pragma omp atomic
+ ++z;
+ #pragma omp atomic
+ --z;
+ #pragma omp atomic
+ z += 1;
+ #pragma omp atomic
+ z *= 3;
+ #pragma omp atomic
+ z /= 3;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-9.c b/gcc/testsuite/gcc.dg/gomp/atomic-9.c
new file mode 100644
index 00000000000..128e9df5e4a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/atomic-9.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+volatile int *bar(void);
+
+void f1(void)
+{
+ #pragma omp atomic
+ *bar() += 1;
+}
+
+/* { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 1 "gimple" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/barrier-1.c b/gcc/testsuite/gcc.dg/gomp/barrier-1.c
new file mode 100644
index 00000000000..ef7c9afb18b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/barrier-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+void f1(void)
+{
+ #pragma omp barrier
+}
+
+void f2(_Bool p)
+{
+ if (p)
+ {
+ #pragma omp barrier
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_barrier" 2 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/barrier-2.c b/gcc/testsuite/gcc.dg/gomp/barrier-2.c
new file mode 100644
index 00000000000..6e94d0c25c6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/barrier-2.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp barrier a /* { dg-error "expected end of line" } */
+}
+
+/* OpenMP 2.5, section 2.7.3:
+
+ Note that because the barrier construct does not have a C language
+ statement as part of its syntax, there are some restrictions on its
+ placement within a program. The barrier directive may only be placed
+ in the program at a position where ignoring or deleting the directive
+ would result in a program with correct syntax. */
+
+void f2(void)
+{
+ label:
+ #pragma omp barrier
+} /* { dg-error "label at end of compound statement" } */
+
+void f3(_Bool p)
+{
+ if (p)
+ #pragma omp barrier /* { dg-error "compound statements" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-1.c b/gcc/testsuite/gcc.dg/gomp/block-1.c
new file mode 100644
index 00000000000..abc66e580fd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-1.c
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+void foo()
+{
+ bad1:
+ #pragma omp parallel
+ goto bad1; // { dg-error "invalid exit" }
+
+ goto bad2; // { dg-error "invalid entry" }
+ #pragma omp parallel
+ {
+ bad2: ;
+ }
+
+ #pragma omp parallel
+ {
+ int i;
+ goto ok1;
+ for (i = 0; i < 10; ++i)
+ { ok1: break; }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-10.c b/gcc/testsuite/gcc.dg/gomp/block-10.c
new file mode 100644
index 00000000000..76ee3974508
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-10.c
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+void foo(int i)
+{
+ int j;
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp parallel
+ { case 0:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp for
+ for (j = 0; j < 10; ++ j)
+ { case 1:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp critical
+ { case 2:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp master
+ { case 3:; }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp sections
+ { case 4:;
+ #pragma omp section
+ { case 5:; }
+ }
+ }
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp ordered
+ { default:; }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-11.c b/gcc/testsuite/gcc.dg/gomp/block-11.c
new file mode 100644
index 00000000000..c2800061b6e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-11.c
@@ -0,0 +1,19 @@
+/* PR c++/24516 */
+/* { dg-do compile } */
+
+void
+bar (int *p)
+{
+ int m;
+#pragma omp parallel for
+ for (m = 0; m < 1000; ++m)
+ switch (p[m])
+ {
+ case 1:
+ p[m] = 2;
+ break;
+ default:
+ p[m] = 3;
+ break;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-2.c b/gcc/testsuite/gcc.dg/gomp/block-2.c
new file mode 100644
index 00000000000..810b2da07b4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-2.c
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i, j;
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ break; // { dg-error "break" }
+
+ bad1:
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ goto bad1; // { dg-error "invalid exit" }
+
+ goto bad2; // { dg-error "invalid entry" }
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ {
+ bad2: ;
+ }
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ for (j = 0; j < 10; ++j)
+ if (i == j)
+ break;
+
+ #pragma omp for
+ for (i = 0; i < 10; ++i)
+ continue;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-3.c b/gcc/testsuite/gcc.dg/gomp/block-3.c
new file mode 100644
index 00000000000..160047c394c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-3.c
@@ -0,0 +1,57 @@
+// { dg-do compile }
+
+extern int test(int);
+void foo()
+{
+ int i;
+
+ for (i = 0; i < 10; ++i)
+ {
+ #pragma omp sections
+ {
+ continue; // { dg-error "invalid exit" }
+ }
+ }
+
+ #pragma omp sections
+ {
+ #pragma omp section
+ { bad1: ; }
+ #pragma omp section
+ goto bad1; // { dg-error "invalid exit" }
+ }
+
+ #pragma omp sections
+ {
+ goto bad2; // { dg-error "invalid exit" }
+ }
+ bad2:;
+
+ goto bad3; // { dg-error "invalid entry" }
+ #pragma omp sections
+ {
+ bad3: ;
+ }
+
+ #pragma omp sections
+ {
+ goto ok1;
+ ok1:;
+
+ #pragma omp section
+ for (i = 0; i < 10; ++i)
+ if (test(i))
+ break;
+ else
+ continue;
+
+ #pragma omp section
+ switch (i)
+ {
+ case 0:
+ break;
+ default:
+ test(i);
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-4.c b/gcc/testsuite/gcc.dg/gomp/block-4.c
new file mode 100644
index 00000000000..815d36b2e39
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-4.c
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp critical
+ {
+ return; // { dg-error "invalid exit" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-5.c b/gcc/testsuite/gcc.dg/gomp/block-5.c
new file mode 100644
index 00000000000..450106feeb1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-5.c
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp master
+ {
+ goto bad1; // { dg-error "invalid exit" }
+ }
+
+ #pragma omp master
+ {
+ bad1:
+ return; // { dg-error "invalid exit" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-6.c b/gcc/testsuite/gcc.dg/gomp/block-6.c
new file mode 100644
index 00000000000..fa4c5eab5f4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-6.c
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+void foo()
+{
+ #pragma omp ordered
+ {
+ return; // { dg-error "invalid exit" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-7.c b/gcc/testsuite/gcc.dg/gomp/block-7.c
new file mode 100644
index 00000000000..802b3b3a383
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-7.c
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i, j;
+ for (i = 0; i < 10; ++i)
+ {
+ #pragma omp for
+ for (j = ({ continue; 0; }); // { dg-error "invalid exit" }
+ j < ({ continue; 10; }); // { dg-error "invalid exit" }
+ j += ({ continue; 1; })) // { dg-error "invalid exit" }
+ continue;
+
+ #pragma omp for
+ for (j = ({ break; 0; }); // { dg-error "invalid exit" }
+ j < ({ break; 10; }); // { dg-error "invalid exit" }
+ j += ({ break; 1; })) // { dg-error "invalid exit" }
+ break; // { dg-error "break" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-8.c b/gcc/testsuite/gcc.dg/gomp/block-8.c
new file mode 100644
index 00000000000..177acaa28c0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-8.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// PR 24451
+
+int foo()
+{
+ int i;
+
+ #pragma omp parallel for
+ for (i = 0; i < 10; ++i)
+ return 0; // { dg-error "invalid exit" }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/block-9.c b/gcc/testsuite/gcc.dg/gomp/block-9.c
new file mode 100644
index 00000000000..9217cb74990
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/block-9.c
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+void foo(int i)
+{
+ int j;
+ switch (i) // { dg-error "invalid entry" }
+ {
+ #pragma omp parallel
+ { case 0:; }
+ #pragma omp for
+ for (j = 0; j < 10; ++ j)
+ { case 1:; }
+ #pragma omp critical
+ { case 2:; }
+ #pragma omp master
+ { case 3:; }
+ #pragma omp sections
+ { case 4:;
+ #pragma omp section
+ { case 5:; }
+ }
+ #pragma omp ordered
+ { default:; }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/clause-1.c b/gcc/testsuite/gcc.dg/gomp/clause-1.c
new file mode 100644
index 00000000000..ace9738043a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/clause-1.c
@@ -0,0 +1,94 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#define p parallel
+
+extern void bar (void);
+extern char q[];
+int t;
+#pragma omp threadprivate (t)
+
+void
+foo (int x)
+{
+ char *p;
+ struct S { int i; int j; } s;
+ char a[32];
+ double d;
+ int i;
+ const int c = 8;
+#pragma omp p shared (x, x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p private (x) private (x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p shared (x) firstprivate (x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p firstprivate (x, x) /* { dg-error "more than once" } */
+ ;
+#pragma omp p for shared (x) lastprivate (x) /* { dg-error "more than" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p for private (x) lastprivate (x) /* { dg-error "more than" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p for lastprivate (x, x) /* { dg-error "more than once" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp single private (x) copyprivate (x) /* { dg-error "more than" } */
+ ;
+#pragma omp p shared (bar) /* { dg-error "is not a variable" } */
+ ;
+#pragma omp p private (bar) /* { dg-error "is not a variable" } */
+ ;
+#pragma omp p firstprivate (bar) /* { dg-error "is not a variable" } */
+ ;
+#pragma omp p reduction (+:p) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p reduction (*:s) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p reduction (-:a) /* { dg-error "has invalid type for" } */
+ ;
+ d = 0;
+#pragma omp p reduction (*:d)
+ ;
+#pragma omp p reduction (|:d) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p reduction (&&:d) /* { dg-error "has invalid type for" } */
+ ;
+#pragma omp p copyin (d) /* { dg-error "must be 'threadprivate'" } */
+ ;
+#pragma omp p copyin (x) /* { dg-error "must be 'threadprivate'" } */
+ ;
+#pragma omp p for firstprivate (x) lastprivate (x)
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p private (q) /* { dg-error "incomplete type" } */
+ ;
+#pragma omp p firstprivate (q) /* { dg-error "incomplete type" } */
+ ;
+#pragma omp p for lastprivate (q) /* { dg-error "incomplete type" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p shared (t) /* { dg-error "predetermined 'threadprivate'" } */
+ ;
+#pragma omp p private (t) /* { dg-error "predetermined 'threadprivate'" } */
+ ;
+#pragma omp p firstprivate (t) /* { dg-error "predetermined 'threadpriv" } */
+ ;
+#pragma omp p for lastprivate (t) /* { dg-error "predetermined 'threadpr" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p reduction (*:t) /* { dg-error "predetermined 'threadprivate" } */
+ ;
+#pragma omp p shared (c) /* { dg-error "predetermined 'shared'" } */
+ ;
+#pragma omp p private (c) /* { dg-error "predetermined 'shared'" } */
+ ;
+#pragma omp p firstprivate (c) /* { dg-error "predetermined 'shared'" } */
+ ;
+#pragma omp p for lastprivate (c) /* { dg-error "predetermined 'shared'" } */
+ for (i = 0; i < 10; i++)
+ ;
+#pragma omp p reduction (*:c) /* { dg-error "predetermined 'shared'" } */
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/copyin-1.c b/gcc/testsuite/gcc.dg/gomp/copyin-1.c
new file mode 100644
index 00000000000..117f82f8134
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/copyin-1.c
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+int i, j;
+
+#pragma omp threadprivate (i)
+
+void bar(void);
+void foo(void)
+{
+ int k;
+ extern int l;
+ extern int m;
+
+#pragma omp threadprivate (m)
+
+ #pragma omp parallel copyin(i)
+ bar();
+ #pragma omp parallel copyin(j) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(k) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(l) // { dg-error "threadprivate" }
+ bar();
+ #pragma omp parallel copyin(m)
+ bar();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-1.c b/gcc/testsuite/gcc.dg/gomp/critical-1.c
new file mode 100644
index 00000000000..bdc7bad7b82
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp critical
+ bar(0);
+
+ /* Note that "name" is in its own namespace, thus this foo is not
+ the same as the function. */
+ #pragma omp critical(foo)
+ {
+ bar(1);
+ bar(2);
+ }
+
+ #pragma omp critical
+ #pragma omp critical(foo)
+ bar(3);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_critical_start" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_end" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_name_start" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_critical_name_end" 2 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-2.c b/gcc/testsuite/gcc.dg/gomp/critical-2.c
new file mode 100644
index 00000000000..d1ba3963f8f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-2.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp critical a /* { dg-error "expected" } */
+ ;
+ #pragma omp critical ( /* { dg-error "expected identifier" } */
+ ;
+ #pragma omp critical (a /* { dg-error "expected .\\)." } */
+ ;
+ #pragma omp critical (a b) /* { dg-error "expected .\\)." } */
+} /* { dg-error "expected expression" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-3.c b/gcc/testsuite/gcc.dg/gomp/critical-3.c
new file mode 100644
index 00000000000..9cd73ac046c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-3.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-omplower" }
+
+void bar(void);
+void foo(void)
+{
+ #pragma omp critical (xyzzy)
+ bar();
+}
+
+// { dg-final { scan-tree-dump-times "\\&\\.gomp_critical_user_xyzzy" 2 "omplower" } }
diff --git a/gcc/testsuite/gcc.dg/gomp/empty.c b/gcc/testsuite/gcc.dg/gomp/empty.c
new file mode 100644
index 00000000000..18af1d80d11
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/empty.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -fdump-tree-omplower" } */
+
+main()
+{
+#pragma omp parallel
+ {;}
+}
+
+/* There should not be a GOMP_parallel_start call. */
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_start" 0 "omplower"} } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/flush-1.c b/gcc/testsuite/gcc.dg/gomp/flush-1.c
new file mode 100644
index 00000000000..d1a4d4a5bfb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/flush-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-gimple" } */
+
+void f1(void)
+{
+ #pragma omp flush
+}
+
+int x, y, z;
+
+void f2(_Bool p)
+{
+ if (p)
+ {
+ #pragma omp flush (x)
+ }
+ else
+ {
+ #pragma omp flush (x, y, z)
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "__sync_synchronize" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/flush-2.c b/gcc/testsuite/gcc.dg/gomp/flush-2.c
new file mode 100644
index 00000000000..c2685d837ae
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/flush-2.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp flush a /* { dg-error "expected" } */
+ #pragma omp flush ( /* { dg-error "expected identifier" } */
+ #pragma omp flush (b /* { dg-error "undeclared|expected|for each" } */
+ #pragma omp flush (c d) /* { dg-error "undeclared|expected" } */
+ #pragma omp flush (e) /* { dg-error "undeclared" } */
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-1.c b/gcc/testsuite/gcc.dg/gomp/for-1.c
new file mode 100644
index 00000000000..59b1528e492
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-1.c
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+
+void foo (int j, int k)
+{
+ int i;
+
+ /* Valid loops. */
+ #pragma omp for
+ for (i = 0; i < 10; i++)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i <= 10; i+=4)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i > 0; i = i - 1)
+ baz (j);
+
+ #pragma omp for
+ for (i = j; i >= k; i--)
+ baz (i);
+
+ /* Malformed parallel loops. */
+ #pragma omp for
+ i = 0; /* { dg-error "for statement expected" } */
+ for ( ; i < 10; )
+ {
+ baz (i);
+ i++;
+ }
+
+ #pragma omp for
+ for (i = 0; ; i--) /* { dg-error "missing controlling predicate" } */
+ {
+ if (i >= 10)
+ break; /* { dg-error "break" } */
+ baz (i);
+ }
+
+ #pragma omp for
+ for (i = 0; i < 10 && j > 4; i-=3) /* { dg-error "invalid controlling predicate" } */
+ baz (i);
+
+ #pragma omp for
+ for (i = 0; i < 10; i-=3, j+=2) /* { dg-error "invalid increment expression" } */
+ baz (i);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-10.c b/gcc/testsuite/gcc.dg/gomp/for-10.c
new file mode 100644
index 00000000000..9dfac165b0a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-10.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(runtime) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-11.c b/gcc/testsuite/gcc.dg/gomp/for-11.c
new file mode 100644
index 00000000000..8c747cdb981
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-11.c
@@ -0,0 +1,73 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -fopenmp" } */
+
+extern void baz (int);
+
+void foo (int j, int k)
+{
+ int i;
+
+ /* Valid loops. */
+ #pragma omp for
+ for (i = 0; i < 10; i++)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i <= 10; i+=4)
+ baz (i);
+
+ #pragma omp for
+ for (i = j; i > 0; i = i - 1)
+ baz (j);
+
+ #pragma omp for
+ for (i = j; i >= k; i--)
+ baz (i);
+
+ #pragma omp for
+ for (int l = j; l < 10; l++)
+ baz (l);
+
+ /* Malformed parallel loops. */
+ #pragma omp for
+ i = 0; /* { dg-error "for statement expected" } */
+ for ( ; i < 10; )
+ {
+ baz (i);
+ i++;
+ }
+
+ #pragma omp for
+ for (i = 0; ; i--) /* { dg-error "missing controlling predicate" } */
+ {
+ if (i >= 10)
+ break; /* { dg-error "break" } */
+ baz (i);
+ }
+
+ #pragma omp for
+ for (i = 0;
+ i < 10 && j > 4; /* { dg-error "invalid controlling predicate" } */
+ i-=3)
+ baz (i);
+
+ #pragma omp for
+ for (i = 0;
+ i < 10;
+ i-=3, j+=2) /* { dg-error "invalid increment expression" } */
+ baz (i);
+
+ int m = 0;
+ #pragma omp for
+ for (; m < 10; m++) /* { dg-error "expected" } */
+ baz (m);
+
+ m = 0;
+ #pragma omp for
+ for (int n = 0; m < 10; m++) /* { dg-error "invalid controlling predicate|invalid increment expression" } */
+ baz (m);
+
+ #pragma omp for
+ for (m = 0; m < 10; i++) /* { dg-error "invalid increment expression" } */
+ baz (m);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-12.c b/gcc/testsuite/gcc.dg/gomp/for-12.c
new file mode 100644
index 00000000000..98318d7d5ae
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-12.c
@@ -0,0 +1,12 @@
+int foo (void)
+{
+ int i, a;
+
+ a = 30;
+
+ #pragma omp parallel for lastprivate (a)
+ for (i = 0; i < 10; i++)
+ a = a + i;
+
+ return a;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-13.c b/gcc/testsuite/gcc.dg/gomp/for-13.c
new file mode 100644
index 00000000000..16e971f1927
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-13.c
@@ -0,0 +1,18 @@
+// At one point in development, a typo disabled the remapping of the
+// for iteration variable as private.
+
+// { dg-do compile }
+// { dg-options "-fopenmp -fdump-tree-lower" }
+
+extern void bar(int);
+void foo(void)
+{
+ int i;
+
+#pragma omp parallel for default(none)
+ for (i = 0; i < 10; i++)
+ bar(i);
+}
+
+// { dg-final { scan-tree-dump-times "omp_data_o" 0 "lower" } }
+// { dg-final { cleanup-tree-dump "lower" } }
diff --git a/gcc/testsuite/gcc.dg/gomp/for-14.c b/gcc/testsuite/gcc.dg/gomp/for-14.c
new file mode 100644
index 00000000000..fb264137025
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-14.c
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+extern int printf (const char *, ...);
+extern void foo (int *);
+
+int main (void)
+{
+ double d = 6;
+ int i = 1, j = 6, k = 8;
+#pragma omp parallel shared(d) private(i) num_threads (4)
+ {
+ i = 4;
+#pragma omp for lastprivate(j)
+ for (j = 1; j <= k; j++)
+ printf ("%s %d %d %d %p %g\n", "Hello, World!", i, j, k, &j, d);
+ printf ("%s %d %g\n", "Hello, World!", i, d);
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-15.c b/gcc/testsuite/gcc.dg/gomp/for-15.c
new file mode 100644
index 00000000000..28c2c926cb7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-15.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void foo()
+{
+ long n = 10;
+ int i;
+#pragma omp for
+ for (i=0; i < n; ++i) ;
+#pragma omp for
+ for (i=0; n > i; ++i) ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-16.c b/gcc/testsuite/gcc.dg/gomp/for-16.c
new file mode 100644
index 00000000000..2f221e4c13a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-16.c
@@ -0,0 +1,18 @@
+// PR 24703
+// { dg-do compile }
+
+void work(int);
+int work_param;
+int sphinx_omp_thread_count;
+int schedule_loop_cap;
+
+int measure_omp_parallel_for_dynamic (void)
+{
+ int j;
+
+#pragma omp parallel for schedule(dynamic)
+ for(j=0; j < sphinx_omp_thread_count * schedule_loop_cap; j++)
+ work(work_param);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-17.c b/gcc/testsuite/gcc.dg/gomp/for-17.c
new file mode 100644
index 00000000000..1c51f1a4c86
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-17.c
@@ -0,0 +1,67 @@
+/* { dg-do compile } */
+extern int bar (int);
+
+void
+foo (void)
+{
+ int j, k = 1, l = 30, m = 4;
+ long int o = 4;
+ long long int p = 0;
+#pragma omp for
+ for (j = k; j <= l; j += m - 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += bar (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + m - 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + (m - 1))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + bar (m - 1))
+ ;
+#pragma omp for
+ for (j = ({ int n; n = k; n; }); j <= l; j++)
+ ;
+#pragma omp for
+ for (j = k; j <= ({ int n; n = l; n; }); j++)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += ({ int n; n = 1; n; }))
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += m + 1)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += o)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + o)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = o + 1 + j)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = o + m + j)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j += o + p)
+ ;
+#pragma omp for
+ for (j = k; j <= l; j = j + o + p)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= o)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= p)
+ ;
+#pragma omp for
+ for (j = l; j >= k; j -= o + p)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-18.c b/gcc/testsuite/gcc.dg/gomp/for-18.c
new file mode 100644
index 00000000000..c875a0c5f81
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-18.c
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -fdump-tree-omplower" } */
+
+void
+foo (int *a, int i)
+{
+ int j, k = 1, l = 30, m = 4;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 1;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 2;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 3;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 4;
+}
+
+void
+bar (int *a, int i)
+{
+ int j, k = 1, l = 30, m = 4;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, i * 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 1;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, i * 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 2;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, 4)
+ for (j = 0; j <= l; j++)
+ a[j] = 3;
+#pragma omp parallel for num_threads (3 * i) schedule (guided, 4)
+ for (j = k; j <= l; j += (m - 1))
+ a[j] = 4;
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_dynamic_start" 4 "omplower" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_guided_start" 4 "omplower" { xfail *-*-* } } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-19.c b/gcc/testsuite/gcc.dg/gomp/for-19.c
new file mode 100644
index 00000000000..a202ba4799f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-19.c
@@ -0,0 +1,21 @@
+/* Verify that if GOMP_parallel_loop_dynamic_start is used, variables
+ mentioned in the INIT, COND and INCR expressions aren't unnecessarily
+ copied to the omp_fn function. */
+/* { dg-do compile } */
+/* { dg-options "-O -fopenmp -fdump-tree-gimple" } */
+
+void foo (int *a, int i, int j, int k, int l, int m)
+{
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = 0; j <= (6 * l + 4 * k); j++)
+ a[j] = 1;
+#pragma omp parallel for num_threads (3 * i) schedule (dynamic, i * 4)
+ for (j = m; j <= l; j += (k + l - m))
+ a[j] = 1;
+}
+
+/* { dg-final { scan-tree-dump-times "shared\\(a\\)" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "shared\\(k\\)" 0 "gimple" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "shared\\(l\\)" 0 "gimple" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "shared\\(m\\)" 0 "gimple" { xfail *-*-* } } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-2.c b/gcc/testsuite/gcc.dg/gomp/for-2.c
new file mode 100644
index 00000000000..37e5929afa1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-2.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void foo()
+{
+ int i;
+
+ #pragma omp for nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for nowait nowait /* { dg-error "too many" } */
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for ordered
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for ordered ordered /* { dg-error "too many" } */
+ for (i = 0; i < 10; ++i) ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-3.c b/gcc/testsuite/gcc.dg/gomp/for-3.c
new file mode 100644
index 00000000000..f3b0dbda7c8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-3.c
@@ -0,0 +1,62 @@
+// { dg-do compile }
+
+int bar ();
+
+void foo()
+{
+ int i;
+
+ #pragma omp for schedule // { dg-error "expected '\\('" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule static // { dg-error "expected '\\('" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( // { dg-error "invalid schedule kind" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static )
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( foo ) // { dg-error "invalid schedule kind" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static 1 // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static 1 ) nowait // { dg-error "expected" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1 ) nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1, 1 ) nowait // { dg-error "expected '\\)'" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1 + 1 ) nowait
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule ( static, 1.0 ) // { dg-error "expected integer expression" }
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (dynamic)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (dynamic, bar ())
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (guided)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (guided, bar ())
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (runtime)
+ for (i = 0; i < 10; ++i) ;
+
+ #pragma omp for schedule (runtime, bar ()) // { dg-error "does not take" }
+ for (i = 0; i < 10; ++i) ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/for-4.c b/gcc/testsuite/gcc.dg/gomp/for-4.c
new file mode 100644
index 00000000000..c5f1bb8d13d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-4.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(dynamic)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-5.c b/gcc/testsuite/gcc.dg/gomp/for-5.c
new file mode 100644
index 00000000000..6d9722a97f4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-5.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(guided)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-6.c b/gcc/testsuite/gcc.dg/gomp/for-6.c
new file mode 100644
index 00000000000..9361205e757
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-6.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(runtime)
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-7.c b/gcc/testsuite/gcc.dg/gomp/for-7.c
new file mode 100644
index 00000000000..b3eb997cb38
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-7.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(static) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-8.c b/gcc/testsuite/gcc.dg/gomp/for-8.c
new file mode 100644
index 00000000000..c1386ce4a41
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-8.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(dynamic) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/for-9.c b/gcc/testsuite/gcc.dg/gomp/for-9.c
new file mode 100644
index 00000000000..2a554d51527
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/for-9.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-lower" } */
+
+extern void bar(int);
+
+void foo (int n)
+{
+ int i;
+
+ #pragma omp for schedule(guided) ordered
+ for (i = 0; i < n; ++i)
+ bar(i);
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_start" 1 "lower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_next" 1 "lower" } } */
+/* { dg-final { cleanup-tree-dump "lower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/gomp.exp b/gcc/testsuite/gcc.dg/gomp/gomp.exp
new file mode 100644
index 00000000000..cb1b3384689
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/gomp.exp
@@ -0,0 +1,14 @@
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [find $srcdir/$subdir *.c]] \
+ "" "-fopenmp"
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-1.c b/gcc/testsuite/gcc.dg/gomp/macro-1.c
new file mode 100644
index 00000000000..b04610d2ccf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/macro-1.c
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+#define N 10
+
+extern void bar(void);
+void foo(void)
+{
+ #pragma omp parallel num_threads(N)
+ bar();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-2.c b/gcc/testsuite/gcc.dg/gomp/macro-2.c
new file mode 100644
index 00000000000..75d6490cd7c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/macro-2.c
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+#define p parallel
+#define s(x) shared(x##1, x##2)
+#define d(x) default(x)
+
+void bar(int, int, int, int);
+void foo(void)
+{
+ int a1, a2, b1, b2;
+
+ #pragma omp p s(a) s(b) d(none)
+ bar(a1, a2, b1, b2);
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/master-1.c b/gcc/testsuite/gcc.dg/gomp/master-1.c
new file mode 100644
index 00000000000..2681c216a3f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/master-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp master
+ bar(0);
+
+ #pragma omp master
+ {
+ bar(1);
+ bar(2);
+ }
+
+ /* Yes, this is legal -- structured-block contains statement contains
+ openmp-construct contains master-construct. */
+ #pragma omp master
+ #pragma omp master
+ #pragma omp master
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/master-2.c b/gcc/testsuite/gcc.dg/gomp/master-2.c
new file mode 100644
index 00000000000..3b0bdfc90a4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/master-2.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp master asdf /* { dg-error "expected" } */
+ #pragma omp master
+} /* { dg-error "expected expression" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/master-3.c b/gcc/testsuite/gcc.dg/gomp/master-3.c
new file mode 100644
index 00000000000..37966106df5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/master-3.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp master
+ bar(0);
+}
+
+/* { dg-final { scan-tree-dump-times "omp_get_thread_num" 1 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/num-threads-1.c b/gcc/testsuite/gcc.dg/gomp/num-threads-1.c
new file mode 100644
index 00000000000..f792ef96bcd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/num-threads-1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+extern void bar(void);
+void foo(void)
+{
+ #pragma omp parallel num_threads (0) /* { dg-warning "must be positive" } */
+ {
+ bar ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c b/gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c
new file mode 100644
index 00000000000..ca06aeef9ef
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/omp-parallel-if.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+extern int foo(void);
+extern void bar(void);
+
+int main ()
+{
+ /* Malformed uses of 'if' and 'num_threads'. */
+ #pragma omp parallel if (foo () > 10) if (foo () == 3) /* { dg-error "too many" } */
+ {
+ bar ();
+ }
+
+ #pragma omp parallel num_threads (3) num_threads (20) /* { dg-error "too many" } */
+ {
+ bar ();
+ }
+
+ /* Valid uses of 'if' and 'num_threads'. */
+ #pragma omp parallel if (foo () == 10) num_threads (foo ())
+ {
+ bar ();
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/ordered-1.c b/gcc/testsuite/gcc.dg/gomp/ordered-1.c
new file mode 100644
index 00000000000..a1cd7f48602
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/ordered-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fdump-tree-omplower" } */
+
+extern void bar(int);
+
+void foo (void)
+{
+ #pragma omp ordered
+ bar(0);
+
+ #pragma omp ordered
+ {
+ bar(1);
+ bar(2);
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "GOMP_ordered_start" 2 "omplower" } } */
+/* { dg-final { scan-tree-dump-times "GOMP_ordered_end" 2 "omplower" } } */
+/* { dg-final { cleanup-tree-dump "omplower" } } */
diff --git a/gcc/testsuite/gcc.dg/gomp/ordered-2.c b/gcc/testsuite/gcc.dg/gomp/ordered-2.c
new file mode 100644
index 00000000000..2884b10261c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/ordered-2.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void f1(void)
+{
+ #pragma omp ordered asdf /* { dg-error "expected" } */
+ #pragma omp ordered
+} /* { dg-error "expected expression" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-1.c b/gcc/testsuite/gcc.dg/gomp/parallel-1.c
new file mode 100644
index 00000000000..c5c233b76eb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-1.c
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i;
+
+ #pragma omp parallel
+ {
+ #pragma omp parallel
+ {
+ #pragma omp parallel
+ {
+ i++;
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-2.c b/gcc/testsuite/gcc.dg/gomp/parallel-2.c
new file mode 100644
index 00000000000..68e577766b1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-2.c
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i;
+
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ #pragma omp parallel
+ {
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ i++; // { dg-error "not specified" }
+ }
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-3.c b/gcc/testsuite/gcc.dg/gomp/parallel-3.c
new file mode 100644
index 00000000000..633d7ba5998
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-3.c
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+extern int printf (const char *, ...);
+
+int main (void)
+{
+ double d = 6;
+ int i = 1;
+#pragma omp parallel shared(d) private(i) num_threads (4 + i)
+ {
+ i = 4;
+ printf ("%s %d %g\n", "Hello, World!", i, d);
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/parallel-4.c b/gcc/testsuite/gcc.dg/gomp/parallel-4.c
new file mode 100644
index 00000000000..b8cd174a31b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/parallel-4.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+extern void bar (void);
+
+int main (void)
+{
+ int i;
+#pragma omp parallel for nowait /* { dg-error "'nowait'" } */
+ for (i = 0; i < 10; i++)
+ bar ();
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-1.c b/gcc/testsuite/gcc.dg/gomp/sections-1.c
new file mode 100644
index 00000000000..43704908e43
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-1.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+
+void f1(void)
+{
+ #pragma omp sections nowait
+ {
+ bar (1);
+ #pragma omp section
+ bar (2);
+ #pragma omp section
+ bar (3);
+ #pragma omp section
+ bar (4);
+ #pragma omp section
+ bar (5);
+ }
+}
+
+void f2(void)
+{
+ #pragma omp sections
+ {
+ #pragma omp section
+ {
+ bar (1);
+ bar (1);
+ }
+ #pragma omp section
+ bar (2);
+ #pragma omp section
+ bar (3);
+ #pragma omp section
+ bar (4);
+ #pragma omp section
+ bar (5);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-2.c b/gcc/testsuite/gcc.dg/gomp/sections-2.c
new file mode 100644
index 00000000000..aabdfaf8069
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-2.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+
+extern void bar(int);
+void foo(void)
+{
+ #pragma omp sections
+ bar (0); // { dg-error "expected" }
+
+ #pragma omp sections
+ {
+ } // { dg-error "expected" }
+
+ #pragma omp sections
+ {
+ bar (1);
+ }
+
+ #pragma omp sections
+ {
+ #pragma omp section
+ bar(2);
+ bar(3); // { dg-error "expected" }
+ bar(4);
+ #pragma omp section
+ bar(5);
+ bar(6); // { dg-error "expected" }
+ bar(7);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-3.c b/gcc/testsuite/gcc.dg/gomp/sections-3.c
new file mode 100644
index 00000000000..d8fb2a09d30
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-3.c
@@ -0,0 +1,15 @@
+
+// { dg-do compile }
+
+extern void bar (void);
+
+int main (void)
+{
+ #pragma omp parallel sections nowait /* { dg-error "'nowait'" } */
+ {
+ #pragma omp section
+ { bar(); }
+ #pragma omp section
+ { bar(); }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sections-4.c b/gcc/testsuite/gcc.dg/gomp/sections-4.c
new file mode 100644
index 00000000000..44e7de98c20
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sections-4.c
@@ -0,0 +1,13 @@
+/* PR c++/24613 */
+/* { dg-compile } */
+
+#pragma omp section /* { dg-error "may only be used in" } */
+
+int i;
+
+void
+foo (void)
+{
+ #pragma omp section /* { dg-error "may only be used in" } */
+ i++;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sharing-1.c b/gcc/testsuite/gcc.dg/gomp/sharing-1.c
new file mode 100644
index 00000000000..90d389b7292
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sharing-1.c
@@ -0,0 +1,58 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+#include <stdlib.h>
+
+int thrglobalvar;
+#pragma omp threadprivate (thrglobalvar)
+int globalvar;
+const int constvar = 8;
+
+int
+foo (int x)
+{
+ return x;
+}
+
+int
+bar (int *x)
+{
+ return *x;
+}
+
+int
+main (void)
+{
+ static int thrlocvar;
+#pragma omp threadprivate (thrlocvar)
+ static int locvar;
+ static int *p;
+ int i, j, s, l;
+
+ p = malloc (sizeof (int));
+ if (p == NULL)
+ return 0;
+ *p = 7;
+ s = 6;
+ l = 0;
+#pragma omp parallel for /* { dg-error "enclosing parallel" } */ \
+ default (none) private (p) shared (s)
+ for (i = 0; i < 64; i++)
+ {
+ int k = foo (0); /* Predetermined - private (automatic var declared */
+ k++; /* in scope of construct). */
+ thrglobalvar++; /* Predetermined - threadprivate. */
+ thrlocvar++; /* Predetermined - threadprivate. */
+ foo (i); /* Predetermined - private (omp for loop variable). */
+ foo (constvar); /* Predetermined - shared (const qualified type). */
+ foo (*p); /* *p predetermined - shared (heap allocated */
+ (*p)++; /* storage). */
+ bar (p); /* Explicitly determined - private. */
+ foo (s); /* Explicitly determined - shared. */
+ globalvar++; /* { dg-error "not specified in" } */
+ locvar++; /* { dg-error "not specified in" } */
+ l++; /* { dg-error "not specified in" } */
+ for (j = 0; j < 2; j++); /* { dg-error "not specified in" } */
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sharing-2.c b/gcc/testsuite/gcc.dg/gomp/sharing-2.c
new file mode 100644
index 00000000000..33bbb3bade8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sharing-2.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+ int i;
+ int a[10];
+ #pragma omp parallel private (i) shared (a)
+ {
+ i = 1;
+ #pragma omp parallel shared (a, i)
+ {
+ #pragma omp master
+ i = 2;
+ #pragma omp parallel private (i) shared (a)
+ {
+ for (i = 0; i < 10; i++)
+ a[i] = i + 1;
+ }
+ #pragma omp master
+ i = 3;
+ }
+ i = 4;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/sharing-3.c b/gcc/testsuite/gcc.dg/gomp/sharing-3.c
new file mode 100644
index 00000000000..36f72e3abb9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/sharing-3.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+#define N 50
+#define CHUNKSIZE 5
+
+main ()
+{
+ int i, chunk;
+ float c[N];
+
+ chunk = CHUNKSIZE;
+#pragma omp parallel for shared (c, chunk) schedule (dynamic, chunk)
+ for (i = 0; i < N; i++)
+ c[i] = i;
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/static.c b/gcc/testsuite/gcc.dg/gomp/static.c
new file mode 100644
index 00000000000..8996d818b31
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/static.c
@@ -0,0 +1,14 @@
+static int bork;
+
+void bar(void);
+
+void foobar (void)
+{
+#pragma omp parallel
+ {
+#pragma omp for lastprivate(bork)
+ for (bork = 0; bork < 100; bork++) {
+ bar();
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/tls-1.c b/gcc/testsuite/gcc.dg/gomp/tls-1.c
new file mode 100644
index 00000000000..9dc102e7e61
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/tls-1.c
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+int tp1;
+static int tp2;
+extern int tp3;
+
+int tp4 = 1;
+static int tp5 = 1;
+
+#pragma omp threadprivate (tp1, tp2, tp3, tp4, tp5)
+
+#pragma omp threadprivate (undef) // { dg-error "undeclared" }
+
+int tp6;
+int foo(void) { return tp6; }
+
+#pragma omp threadprivate (tp6) // { dg-error "after first use" }
diff --git a/gcc/testsuite/gcc.dg/gomp/tls-2.c b/gcc/testsuite/gcc.dg/gomp/tls-2.c
new file mode 100644
index 00000000000..80275f9081c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/tls-2.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls } */
+
+extern char buf[];
+#pragma omp threadprivate (buf) /* { dg-error "has incomplete type" } */
+
+void
+foo (void)
+{
+ int i;
+#pragma omp threadprivate (i) /* { dg-error "automatic variable" } */
+ i = 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/uninit-1.c b/gcc/testsuite/gcc.dg/gomp/uninit-1.c
new file mode 100644
index 00000000000..223e617b461
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/uninit-1.c
@@ -0,0 +1,13 @@
+// PR 24612
+// { dg-do compile }
+// { dg-options "-O -Wuninitialized -fopenmp" }
+
+void foo()
+{
+ int i;
+#pragma omp parallel shared(i)
+ {
+ i = 0;
+ ++i;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-1.c b/gcc/testsuite/gcc.dg/gomp/vla-1.c
new file mode 100644
index 00000000000..bb37f33e60f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-1.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n)
+{
+ int A[n];
+
+ #pragma omp parallel default(none) // { dg-error "enclosing" }
+ {
+ A[0] = 0; // { dg-error "'A' not specified" }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-2.c b/gcc/testsuite/gcc.dg/gomp/vla-2.c
new file mode 100644
index 00000000000..fc18ffc5743
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-2.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel private(A)
+ {
+ A[i] = 0;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-3.c b/gcc/testsuite/gcc.dg/gomp/vla-3.c
new file mode 100644
index 00000000000..b1677b833ef
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-3.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel shared(A)
+ {
+ A[i] = sizeof(A);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-4.c b/gcc/testsuite/gcc.dg/gomp/vla-4.c
new file mode 100644
index 00000000000..2c3c0aa43b7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-4.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel firstprivate(A)
+ {
+ A[i] = 1;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/vla-5.c b/gcc/testsuite/gcc.dg/gomp/vla-5.c
new file mode 100644
index 00000000000..6c6d5517af8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/vla-5.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+void foo(int n, int i)
+{
+ int A[n];
+
+ #pragma omp parallel sections lastprivate(A)
+ {
+ A[i] = 1;
+ }
+}