From d7dfc21c20f55b705e3e749c2c7b31f9a4611c39 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Tue, 12 Feb 2019 11:49:23 +0100 Subject: Distinguish object-related and name-related attributes This is a second step towards mimicking GCC/Clang's handling of attributes. This commit introduces a distinction between - Object-related attributes, such as "section", which apply to the object (function, variable) being defined; - Name-related attributes, such as "aligned", which apply to the name (object, struct/union member, struct/union/enum tag) being defined. In particular, "aligned" is now attached to "struct" and "union" definitions, while it used to be "floated up" before. The C11 _Alignas modifier is treated like an object-related attribute, so that ``` struct s { ... }; _Alignas(64) struct s x; ``` correctly associates the alignment with "x" and not with "struct s", where it would be ignored because it was not part of the original definition of s. --- cfrontend/C2C.ml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'cfrontend') diff --git a/cfrontend/C2C.ml b/cfrontend/C2C.ml index d6bf76f3..d70c4dad 100644 --- a/cfrontend/C2C.ml +++ b/cfrontend/C2C.ml @@ -315,8 +315,9 @@ let attributes = [ ("noinline",Cutil.Attr_function); (* name-related *) ("aligned", Cutil.Attr_name); - ("section", Cutil.Attr_name); - ("unused", Cutil.Attr_name) + (* object-related *) + ("section", Cutil.Attr_object); + ("unused", Cutil.Attr_object) ] -- cgit