aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Elab.ml
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@college-de-france.fr>2019-02-12 11:25:22 +0100
committerXavier Leroy <xavierleroy@users.noreply.github.com>2019-02-25 17:15:36 +0100
commit0616171c89d3db651b6842338fdf2da9da885aa1 (patch)
treef3915dd053050785277c93e8647f13f7202b53e2 /cparser/Elab.ml
parent3881d799d23bcc0cbaaa9e6bfa82c5bc3b2030eb (diff)
downloadcompcert-kvx-0616171c89d3db651b6842338fdf2da9da885aa1.tar.gz
compcert-kvx-0616171c89d3db651b6842338fdf2da9da885aa1.zip
Do not expand type names when floating attributes "up" a declaration
During elaboration of type declarators, non-type-related attributes such as "aligned" or "section" are "floated up" so that they apply to the thing being declared. For example, consider: ``` __attribute((aligned(16))) int * p; ``` The attribute is first attached to type `int`, then floated up to type `int *`, so that it finally applies to `p`, giving a 16-aligned pointer to int, and not a naturally-aligned pointer to 16-aligned int. What happens when the non-type-related attribute comes from a typedef? ``` typedef __attribute((aligned(16))) int i16; i16 * p; ``` CompCert used to expand the typedef then float up the attribute, resulting in `p` being a 16-aligned pointer to int. GCC and Clang produce a naturally-aligned pointer, so they do not expand the typedef before floating. The old CompCert behavior is somewhat surprising, and potentially less useful than the GCC/Clang behavior. This commit changes the floating up of non-type-related attributes so that typedefs and struct/union/enum definitions are not expanded when determining which attributes to float up. This is a first step towards mimicking the GCC/Clang behavior.
Diffstat (limited to 'cparser/Elab.ml')
-rw-r--r--cparser/Elab.ml2
1 files changed, 1 insertions, 1 deletions
diff --git a/cparser/Elab.ml b/cparser/Elab.ml
index 8f27b2a0..8f42fe0a 100644
--- a/cparser/Elab.ml
+++ b/cparser/Elab.ml
@@ -598,7 +598,7 @@ let get_nontype_attrs env ty =
| Attr_type -> false
| Attr_function -> not (is_function_type env ty)
| _ -> true in
- let nta = List.filter to_be_removed (attributes_of_type env ty) in
+ let nta = List.filter to_be_removed (attributes_of_type_no_expand ty) in
(remove_attributes_type env nta ty, nta)
(* Elaboration of a type specifier. Returns 6-tuple: