diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml index 12bb3812be064e1ea24589f4640a5be175b940f9..b72e5035f8292f7be0520c3245b0d4a5af28158a 100644 --- a/src/kernel_internals/typing/cabs2cil.ml +++ b/src/kernel_internals/typing/cabs2cil.ml @@ -3532,7 +3532,8 @@ let fieldsToInit else if found then found, offset :: loff (* if this field is an anonymous comp, search for the designator inside *) - else if prefix anonCompFieldName f.fname && not found then + else if prefix anonCompFieldName f.fname && not found + && f.forig_name <> f.fname then match unrollType f.ftype with | TComp (comp, _, _) -> add_comp offset comp acc (* go deeper inside *) diff --git a/tests/syntax/oracle/rename.res.oracle b/tests/syntax/oracle/rename.res.oracle index d734d2bfa322836ce56e6db7a56fe8ea53e3cce3..52e6869da0887ef55a31547b8483fa061a1024d4 100644 --- a/tests/syntax/oracle/rename.res.oracle +++ b/tests/syntax/oracle/rename.res.oracle @@ -1,5 +1,16 @@ [kernel] Parsing tests/syntax/rename.i (no preprocessing) +[kernel] tests/syntax/rename.i:48: Warning: + unnamed fields are a C11 extension (use -c11 to avoid this warning) /* Generated by Frama-C */ +struct not_anon { + int __anonCompField1 ; +}; +struct __anonstruct_1 { + int inner_i ; +}; +struct anon { + struct __anonstruct_1 __anonCompField1 ; +}; int f(void) { int x = 0; @@ -62,4 +73,6 @@ void f4(int *j_0_1) return; } +struct not_anon s = {.__anonCompField1 = 0}; +struct anon a = {.__anonCompField1 = {.inner_i = 0}}; diff --git a/tests/syntax/rename.i b/tests/syntax/rename.i index d7524ce90d305776a3412f4b41f0247b86b06895..08a549ccc24c4a4c1d072dcbc7046321a8da60e6 100644 --- a/tests/syntax/rename.i +++ b/tests/syntax/rename.i @@ -38,3 +38,15 @@ void f4(int *j_0_1) { { int j_0_1 = j_0; j_0_1+=j_0; } } + +struct not_anon { + int __anonCompField1; +}; + +struct not_anon s = {.__anonCompField1 = 0}; + +struct anon { + struct { int inner_i; }; +}; + +struct anon a = { .inner_i = 0 };