Unsupported OpenACC clauses: sorry message instead of aborting.
[official-gcc.git] / gcc / c / ChangeLog.gomp
blob108ce3e9c28a249e498924b2149bcbbca97dc202
1 2014-06-12  Thomas Schwinge  <thomas@codesourcery.com>
2             James Norris  <jnorris@codesourcery.com>
4         * c-parser.c (c_parser_oacc_all_clauses): Handle
5         PRAGMA_OMP_CLAUSE_IF.
6         (OACC_DATA_CLAUSE_MASK, OACC_KERNELS_CLAUSE_MASK)
7         (OACC_PARALLEL_CLAUSE_MASK, OACC_UPDATE_CLAUSE_MASK): Add it.
9 2014-06-06  Thomas Schwinge  <thomas@codesourcery.com>
10             James Norris  <jnorris@codesourcery.com>
12         * c-parser.c (c_parser_pragma): Handle PRAGMA_OACC_UPDATE.
13         (c_parser_omp_clause_name, c_parser_oacc_data_clause)
14         (c_parser_oacc_all_clauses): Handle PRAGMA_OMP_CLAUSE_DEVICE,
15         PRAGMA_OMP_CLAUSE_HOST, PRAGMA_OMP_CLAUSE_SELF.
16         (c_parser_oacc_update): New function.
18 2014-06-05  Thomas Schwinge  <thomas@codesourcery.com>
20         * c-typeck.c (handle_omp_array_sections, c_finish_omp_clauses):
21         Handle OMP_CLAUSE_MAP_FORCE_DEVICEPTR.
23 2014-03-20  Thomas Schwinge  <thomas@codesourcery.com>
25         * c-parser.c: Update comments.
26         (c_parser_oacc_loop): Move.
27         (c_parser_omp_for_loop): Catch some unsupported cases.
28         (c_parser_omp_construct) <case PRAGMA_OACC_LOOP>: Sort
29         alphabetically.
31 2014-03-18  Ilmir Usmanov  <i.usmanov@samsung.com>
33         * c-parser.c (c_parser_oacc_loop): New function.
34         (c_parser_oacc_kernels): Parse OpenACC combined directive.
35         (c_parser_oacc_parallel): Likewise.
36         (c_parser_omp_construct): Parse OpenACC loop directive.
38 2014-04-18  Thomas Schwinge  <thomas@codesourcery.com>
40         * c-parser.c (c_parser_omp_clause_num_gangs)
41         (c_parser_omp_clause_num_workers)
42         (c_parser_omp_clause_vector_length): New functions.
43         (c_parser_omp_clause_name, c_parser_oacc_all_clauses): Handle
44         PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS,
45         PRAGMA_OMP_CLAUSE_VECTOR_LENGTH.
46         (OACC_PARALLEL_CLAUSE_MARK): Add these.
47         * c-typeck.c (c_finish_omp_clauses): Handle these.
49 2014-02-28  Thomas Schwinge  <thomas@codesourcery.com>
51         * c-parser.c (OACC_KERNELS_CLAUSE_MASK): New macro definition.
52         (c_parser_oacc_kernels): New function.
53         (c_parser_omp_construct): Handle PRAGMA_OACC_KERNELS.
54         * c-tree.h (c_finish_oacc_kernels): New prototype.
55         * c-typeck.c (c_finish_oacc_kernels): New function.
57 2014-02-21  Thomas Schwinge  <thomas@codesourcery.com>
59         * c-parser.c (OACC_DATA_CLAUSE_MASK): New macro definition.
60         (c_parser_oacc_data): New function.
61         (c_parser_omp_construct): Handle PRAGMA_OACC_DATA.
62         * c-tree.h (c_finish_oacc_data): New prototype.
63         * c-typeck.c (c_finish_oacc_data): New function.
65 2014-02-17  Thomas Schwinge  <thomas@codesourcery.com>
67         * c-parser.c (c_parser_omp_clause_name): Accept pcopy, pcopyin,
68         pcopyout, pcreate clauses.
69         (c_parser_oacc_data_clause): Update comment.
71 2014-01-28  Thomas Schwinge  <thomas@codesourcery.com>
73         * c-parser.c (OACC_PARALLEL_CLAUSE_MASK): Add
74         PRAGMA_OMP_CLAUSE_COPY, PRAGMA_OMP_CLAUSE_COPYIN,
75         PRAGMA_OMP_CLAUSE_COPYOUT, PRAGMA_OMP_CLAUSE_CREATE,
76         PRAGMA_OMP_CLAUSE_DEVICEPTR, PRAGMA_OMP_CLAUSE_PRESENT,
77         PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY,
78         PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN,
79         PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT, and
80         PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE.
82         * c-parser.c (c_parser_omp_clause_name): Handle these.
83         (c_parser_oacc_data_clause, c_parser_oacc_data_clause_deviceptr):
84         New functions.
85         (c_parser_oacc_all_clauses): Handle PRAGMA_OMP_CLAUSE_COPY,
86         PRAGMA_OMP_CLAUSE_COPYIN, PRAGMA_OMP_CLAUSE_COPYOUT,
87         PRAGMA_OMP_CLAUSE_CREATE, PRAGMA_OMP_CLAUSE_DELETE,
88         PRAGMA_OMP_CLAUSE_DEVICEPTR, PRAGMA_OMP_CLAUSE_PRESENT,
89         PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY,
90         PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN,
91         PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT, and
92         PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE.
94         * c-parser.c (c_parser_oacc_all_clauses): New function.
95         (c_parser_oacc_parallel): Use it.
96         * c-typeck.c (c_finish_omp_clauses): Update comment.  Remove
97         duplicated variable initialization.
99 2013-11-21  Jakub Jelinek  <jakub@redhat.com>
101         * c-decl.c (c_builtin_function_ext_scope): Don't bind if
102         external_scope is NULL.
104 2013-11-07  Thomas Schwinge  <thomas@codesourcery.com>
106         * c-tree.h (c_finish_oacc_parallel): New declaration.
107         * c-typeck.c (c_finish_oacc_parallel): New function.
109         * c-parser.c (c_parser_omp_structured_block): Update comment.
110         (c_parser_oacc_parallel): New function.
111         (c_parser_omp_construct): Handle PRAGMA_OACC_PARALLEL.
113         * c-parser.c (c_parser_omp_all_clauses): Make a parser error
114         message suitable for OpenACC, too.
116 2013-10-10  Jakub Jelinek  <jakub@redhat.com>
118         * c-parser.c (c_parser_binary_expression): Document omp_atomic_lhs
119         argument in function comment and drop prec argument description.
121         * c-typeck.c (handle_omp_array_sections_1): Change wording
122         of errors requesting specification of length.
123         (c_finish_omp_clauses): For error about non-integral non-pointer
124         linear clause include type in the diagnostic message.
125         * c-parser.c (c_finish_omp_declare_simd): If
126         c_omp_declare_simd_clauses_to_numbers returned non-NULL, store
127         the clauses into TREE_VALUE of an extra TREE_LIST pointed out
128         by TREE_VALUE of the attribute.
130 2013-10-08  Jakub Jelinek  <jakub@redhat.com>
132         * c-typeck.c (c_finish_omp_clauses): Remove name variable, use
133         omp_clause_code_name[OMP_CLAUSE_CODE (c) instead.
135 2013-09-25  Jakub Jelinek  <jakub@redhat.com>
137         * c-parser.c (c_parser_omp_taskgroup): Return tree.
138         Don't call c_begin_omp_taskgroup.
139         (c_parser_omp_construct): Adjust caller.
140         * c-typeck.c (c_begin_omp_taskgroup, c_finish_omp_taskgroup): Remove.
141         * c-tree.h (c_begin_omp_taskgroup, c_finish_omp_taskgroup): Remove.
143 2013-09-19  Jakub Jelinek  <jakub@redhat.com>
145         * c-tree.h (c_omp_reduction_id, c_omp_reduction_decl,
146         c_omp_reduction_lookup, c_check_omp_declare_reduction_r): New
147         prototypes.
148         * c-typeck.c: Include tree-inline.h.
149         (c_clone_udr, c_find_omp_placeholder_r): New functions.
150         (c_finish_omp_clauses): Handle user defined reductions.
151         * Make-lang.in (c-typeck.o): Depend on $(TREE_INLINE_H).
152         * c-parser.c (c_parser_omp_clause_reduction): Handle user
153         defined reductions.
154         (c_parser_omp_declare_reduction): New function.
155         (c_parser_omp_declare): Call it.
156         * c-decl.c (c_omp_reduction_id, c_omp_reduction_decl,
157         c_omp_reduction_lookup, c_check_omp_declare_reduction_r): New
158         functions.
160 2013-09-05  Jakub Jelinek  <jakub@redhat.com>
162         * c-typeck.c (handle_omp_array_sections_1): Remove pointer_based_p
163         argument.  Do c_save_expr on low bound unconditionally.
164         (handle_omp_array_sections): Adjust caller.  Call c_fully_fold when
165         needed.  Add OMP_CLAUSE_MAP_POINTER map clause even for array based
166         array sections.
167         (c_finish_omp_clauses): Don't complain about non-mappable types
168         for OMP_CLAUSE_MAP_POINTER.  Check for duplicates even for map
169         clauses.  Handle OMP_CLAUSE_NUM_TEAMS.
170         * c-parser.c (c_parser_omp_target_data, c_parser_omp_target): Call
171         keep_next_level ().
173 2013-07-20  Jakub Jelinek  <jakub@redhat.com>
175         * c-typeck.c (c_finish_omp_declare_simd): Moved to...
176         * c-parser.c (c_finish_omp_declare_simd): ... here.  Add
177         first c_parser * argument and change last argument to vec<c_token>.
178         Parse clauses here from the saved c_tokens.
179         (struct c_parser): Change tokens to c_token *.
180         Add tokens_buf field.  Change tokens_avail type to unsigned int.
181         (c_parser_consume_token): If parser->tokens isn't
182         &parser->tokens_buf[0], increment parser->tokens.
183         (c_parser_consume_pragma): Likewise
184         (c_parser_declaration_or_fndef): Change last argument to vec<c_token>.
185         Pass parser as first argument to c_finish_omp_declare_simd.  For
186         prototypes, fix code indentation and call temp_store_parm_decls
187         and temp_pop_parm_decls around c_finish_omp_declare_simd.
188         (c_parser_omp_variable_list): Remove declare_simd argument, call
189         lookup_name unconditionally.
190         (c_parser_omp_var_list_parens, c_parser_omp_clause_reduction,
191         c_parser_omp_clause_depend, c_parser_omp_clause_map,
192         c_parser_omp_clause_uniform): Adjust c_parser_omp_variable_list
193         callers.
194         (c_parser_omp_clause_aligned, c_parser_omp_clause_linear): Likewise.
195         Remove declare_simd argument.
196         (c_parser_omp_all_clauses): Remove declare_simd argument.  Adjust
197         c_parser_omp_clause_aligned and c_parser_omp_clause_linear callers.
198         (c_parser_omp_declare_simd): Don't parse declare simd clauses here,
199         instead push the clause c_tokens starting with simd token up to
200         CPP_PRAGMA_EOL for each #pragma omp declare simd into a vector.
201         (c_parser_omp_declare): Don't consume simd token here.
202         (c_parse_file): Initialize tparser.tokens and the_parser->tokens here.
203         * c-decl.c (temp_store_parm_decls, temp_pop_parm_decls): New
204         functions.
205         * c-tree.h (temp_store_parm_decls, temp_pop_parm_decls): New
206         prototypes.
207         (c_finish_omp_declare_simd): Remove prototype.
209 2013-07-14  Jakub Jelinek  <jakub@redhat.com>
211         * c-typeck.c (c_finish_omp_declare_simd): Don't remove
212         redundant "omp declare simd" clauses here.  Adjust
213         c_omp_declare_simd_clauses_to_numbers caller.
215 2013-07-09  Jakub Jelinek  <jakub@redhat.com>
217         * c-typeck.c (c_finish_omp_cancel): Pass two arguments to GOMP_cancel
218         rather than just one, if no OMP_CLAUSE_IF, pass true, otherwise pass
219         if clause argument.  Emit the call unconditionally.
221 2013-07-06  Jakub Jelinek  <jakub@redhat.com>
223         * c-lang.h (current_omp_declare_target_attribute): New extern
224         decl.
225         * Make-lang.in (c/c-parser.o): Depend on c/c-lang.h.
226         * c-parser.c: Include c-lang.h.
227         (c_parser_pragma): Handle PRAGMA_OMP_TARGET and
228         PRAGMA_OMP_END_DECLARE_TARGET.
229         (c_parser_omp_clause_name): Handle thread_limit clause.
230         (c_parser_omp_variable_list): Parse array sections for
231         OMP_CLAUSE_{DEPEND,MAP,TO,FROM} clauses.
232         (c_parser_omp_clause_reduction): Remove declare_simd argument.
233         Pass false instead of declare_simd to c_parser_omp_variable_list.
234         (c_parser_omp_clause_cancelkind): Remove diagnostics.
235         (c_parser_omp_clause_thread_limit): New function.
236         (c_parser_omp_all_clauses): Add finish_p argument.  Don't call
237         c_finish_omp_clauses if it is false.  Require that
238         OMP_CLAUSE_{PARALLEL,FOR,SECTIONS,TASKGROUP} must be first in
239         the list of clauses.  Adjust c_parser_omp_clause_reduction
240         caller.
241         (c_parser_omp_for_loop): Change last argument to cclauses,
242         and adjust uses to grab parallel clauses from the array of all
243         the split clauses.
244         (omp_split_clauses): New function.
245         (c_parser_omp_simd): Add p_name, mask and cclauses arguments.
246         Allow the function to be called also when parsing combined constructs.
247         (c_parser_omp_sections): Likewise.
248         (c_parser_omp_for): Add p_name, mask and cclauses arguments.
249         Allow the function to be called also when parsing combined constructs,
250         and call cp_parser_omp_simd when parsing for simd.
251         (c_parser_omp_parallel): Likewise.
252         (c_parser_omp_single, c_parser_omp_task, c_parser_omp_cancel,
253         c_parser_omp_cancellation_point, c_parser_omp_declare_simd): Adjust
254         c_parser_omp_all_clauses callers.
255         (OMP_TEAMS_CLAUSE_MASK, OMP_TARGET_CLAUSE_MASK,
256         OMP_TARGET_DATA_CLAUSE_MASK, OMP_TARGET_UPDATE_CLAUSE_MASK,
257         OMP_DISTRIBUTE_CLAUSE_MASK): Define.
258         (c_parser_omp_teams, c_parser_omp_target, c_parser_omp_target_data,
259         c_parser_omp_target_update, c_parser_omp_distribute): New
260         functions.
261         (c_parser_omp_construct): Handle PRAGMA_OMP_DISTRIBUTE and
262         PRAGMA_OMP_TEAMS.  Adjust callers of c_parser_omp_simd,
263         c_parser_omp_sections, c_parser_omp_for and c_parser_omp_parallel.
264         (OMP_DECLARE_SIMD_CLAUSE_MASK): Remove OMP_CLAUSE_REDUCTION.
265         (c_parser_omp_declare_target, c_parser_omp_end_declare_target): New
266         functions.
267         (c_parser_omp_declare): For target keyword call
268         c_parser_omp_declare_target.  Adjust expected keyword diagnostics.
269         * c-decl.c (current_omp_declare_target_attribute): New variable.
270         (c_decl_attributes): New function.
271         (start_decl, start_function): Use it instead of decl_attributes.
272         * c-typeck.c (handle_omp_array_sections_1, handle_omp_array_sections):
273         New functions.
274         (c_finish_omp_clauses): Handle array sections on
275         OMP_CLAUSE_{MAP,TO,FROM,DEPEND}.  If not array sections, mark the
276         decl addressable.  Complain if OMP_CLAUSE_{MAP,TO,FROM}
277         decls or array sections don't have complete type. Handle
278         OMP_CLAUSE_THREAD_LIMIT.
280 2013-07-03  Jakub Jelinek  <jakub@redhat.com>
282         * c-parser.c (c_parser_omp_atomic): Disallow seq_cst before
283         atomic-clause, disallow comma in between atomic-clause and
284         seq_cst.
285         (c_parser_omp_sections_scope): If section-sequence doesn't
286         start with #pragma omp section, require exactly one structured-block
287         instead of sequence of statements.
288         * c-typeck.c (c_finish_omp_clauses): Diagnose copyprivate clause
289         appearing together with nowait clause.
291 2013-06-14  Jakub Jelinek  <jakub@redhat.com>
293         * c-parser.c (c_parser_omp_for): Comment out OMP_FOR_SIMD uses.
294         (c_parser_omp_parallel): Call c_omp_split_clauses instead of
295         c_split_parallel_clauses, adjust the code for different API
296         of the new function.
298 2013-05-13  Jakub Jelinek  <jakub@redhat.com>
300         * c-tree.h (c_finish_omp_declare_simd): New prototype.
301         * c-typeck.c (c_finish_omp_clauses): Handle OMP_CLAUSE_LINEAR_STEP
302         adjustments for pointer-types here.  Diagnose inbranch notinbranch
303         being used together.
304         (c_finish_omp_declare_simd): New function.
305         * c-parser.c (enum pragma_context): Add pragma_struct and
306         pragma_param.
307         (c_parser_declaration_or_fndef): Add omp_declare_simd_clauses
308         argument.  Call c_finish_omp_declare_simd if needed.
309         (c_parser_external_declaration, c_parser_compound_statement_nostart,
310         c_parser_label, c_parser_for_statement, c_parser_objc_methodprotolist,
311         c_parser_omp_for_loop): Adjust c_parser_declaration_or_fndef callers.
312         (c_parser_struct_or_union_specifier): Use pragma_struct instead of
313         pragma_external.
314         (c_parser_parameter_declaration): Use pragma_param instead of
315         pragma_external.
316         (c_parser_pragma): Handle PRAGMA_OMP_DECLARE_REDUCTION.
317         Replace == pragma_external with != pragma_stmt && != pragma_compound
318         test.
319         (c_parser_omp_variable_list): Add declare_simd argument.  Don't lookup
320         vars if it is true, just store identifiers.
321         (c_parser_omp_var_list_parens, c_parser_omp_clause_depend,
322         c_parser_omp_clause_map): Adjust callers.
323         (c_parser_omp_clause_reduction, c_parser_omp_clause_aligned): Add
324         declare_simd argument, pass it through to c_parser_omp_variable_list.
325         (c_parser_omp_clause_linear): Likewise.  Don't handle
326         OMP_CLAUSE_LINEAR_STEP adjustements for pointer-types here.
327         (c_parser_omp_clause_uniform): Call c_parser_omp_variable_list
328         instead of c_parser_omp_var_list_parens to pass true as declare_simd.
329         (c_parser_omp_all_clauses): Add declare_simd argument, pass it through
330         clause parsing routines as needed.  Don't call c_finish_omp_clauses if
331         set.
332         (c_parser_omp_simd, c_parser_omp_for, c_parser_omp_sections,
333         c_parser_omp_parallel, c_parser_omp_single, c_parser_omp_task,
334         c_parser_omp_cancel, c_parser_omp_cancellation_point): Adjust callers.
335         (OMP_DECLARE_SIMD_CLAUSE_MASK): Define.
336         (c_parser_omp_declare_simd, c_parser_omp_declare): New functions.
338 2013-04-30  Jakub Jelinek  <jakub@redhat.com>
340         * c-parser.c (c_parser_omp_atomic): Parse seq_cst clause, pass
341         true if it is present to c_finish_omp_atomic.
343 2013-04-24  Jakub Jelinek  <jakub@redhat.com>
345         * c-parser.c (c_parser_compound_statement,
346         c_parser_statement): Adjust comments for OpenMP 3.0+
347         additions.
348         (c_parser_pragma): Handle PRAGMA_OMP_CANCEL and
349         PRAGMA_OMP_CANCELLATION_POINT.
350         (c_parser_omp_clause_name): Handle new OpenMP 4.0 clauses.
351         (c_parser_omp_clause_collapse): Fully fold collapse
352         expression.
353         (c_parser_omp_clause_branch, c_parser_omp_clause_cancelkind,
354         c_parser_omp_clause_num_teams, c_parser_omp_clause_aligned,
355         c_parser_omp_clause_linear, c_parser_omp_clause_safelen,
356         c_parser_omp_clause_simdlen, c_parser_omp_clause_depend,
357         c_parser_omp_clause_map, c_parser_omp_clause_device,
358         c_parser_omp_clause_dist_schedule, c_parser_omp_clause_proc_bind,
359         c_parser_omp_clause_to, c_parser_omp_clause_from,
360         c_parser_omp_clause_uniform): New functions.
361         (c_parser_omp_all_clauses): Handle new OpenMP 4.0 clauses.
362         (c_parser_omp_for_loop): Add CODE argument, pass it through
363         to c_finish_omp_for.
364         (OMP_SIMD_CLAUSE_MASK): Define.
365         (c_parser_omp_simd): New function.
366         (c_parser_omp_for): Parse #pragma omp for simd.
367         (OMP_PARALLEL_CLAUSE_MASK): Add OMP_CLAUSE_PROC_BIND.
368         (c_parser_omp_parallel): Parse #pragma omp parallel for simd.
369         (OMP_TASK_CLAUSE_MASK): Add OMP_CLAUSE_DEPEND.
370         (c_parser_omp_taskgroup): New function.
371         (OMP_CANCEL_CLAUSE_MASK, OMP_CANCELLATION_POINT_CLAUSE_MASK): Define.
372         (c_parser_omp_cancel, c_parser_omp_cancellation_point): New functions.
373         (c_parser_omp_construct): Handle PRAGMA_OMP_SIMD and
374         PRAGMA_OMP_TASKGROUP.
375         (c_parser_transaction_cancel): Formatting fix.
376         * c-tree.h (c_begin_omp_taskgroup, c_finish_omp_taskgroup,
377         c_finish_omp_cancel, c_finish_omp_cancellation_point): New prototypes.
378         * c-typeck.c (c_begin_omp_taskgroup, c_finish_omp_taskgroup,
379         c_finish_omp_cancel, c_finish_omp_cancellation_point): New functions.
380         (c_finish_omp_clauses): Handle new OpenMP 4.0 clauses.
382 2013-03-27  Jakub Jelinek  <jakub@redhat.com>
384         * c-parser.c (c_parser_omp_all_clauses): Change mask argument type
385         from unsigned to omp_clause_mask.
386         (c_parser_omp_for_loop): Adjust c_finish_omp_for caller.
387         (OMP_FOR_CLAUSE_MASK, OMP_SECTIONS_CLAUSE_MASK,
388         OMP_PARALLEL_CLAUSE_MASK, OMP_SINGLE_CLAUSE_MASK,
389         OMP_TASK_CLAUSE_MASK): Use OMP_CLAUSE_MASK_1 instead of 1.
390         (c_parser_omp_parallel): Use omp_clause_mask type instead of unsigned
391         for mask, use OMP_CLAUSE_MASK_1 instead of 1 for masks.
393 2013-03-20  Jakub Jelinek  <jakub@redhat.com>
395         * c-parser.c (c_parser_expr_no_commas): Add omp_atomic_lhs argument
396         with default value, pass it down to c_parser_conditional_expression.
397         (c_parser_conditional_expression): Add omp_atomic_lhs argument, pass
398         it down to c_parser_binary_expression.  Don't pass PREC_NONE to
399         it.  Adjust recursive call.
400         (c_parser_binary_expression): Remove prec argument, add omp_atomic_lhs
401         argument.  Always start from PREC_NONE, if omp_atomic_lhs is non-NULL
402         and one of the arguments of toplevel binop matches it, use build2
403         instead of parser_build_binary_op.
404         (c_parser_omp_atomic): Handle OpenMP 4.0 atomics.
405         (c_parser_omp_for_loop): Adjust c_parser_binary_expression caller.
406         * c-tree.h (c_tree_equal): New prototype.
407         * c-typeck.c (c_tree_equal): New function.
409         * c-parser.c (c_parser_omp_atomic): Adjust comment.
410         Add another argument to c_finish_omp_atomic.
412 Copyright (C) 2013-2014 Free Software Foundation, Inc.
414 Copying and distribution of this file, with or without modification,
415 are permitted in any medium without royalty provided the copyright
416 notice and this notice are preserved.