This series aims to fix hundreds of missing initializer warnings in generated 
header files
when compiling with -Wextra

V1: Fix the old fashioned way by adding 0s where needed
V2: switch to designated initializers (Emil), didnt send
V3: add some layout so its easier to read and create a new version for vk that
    just uses {0} instead of {0, 0, 0, 0, 0} (same thing, less zeros)

---

Because this generated such unexpected controversy and out of curiosity i wrote 
a little
test program to show the problem. Compile with -Wextra.
There is no init code generated for any variant on any compiler i tested.

gcc version 5.4.1 20170304 (Ubuntu 5.4.1-8ubuntu1)
gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ubuntu2)
gcc version 7.0.1 20170407 (experimental) [trunk revision 246759] (Ubuntu 
7-20170407-0ubuntu2)
clang version 4.0.0-1ubuntu1 (tags/RELEASE_400/rc1)
clang version 5.0.0-svn305158-0~z~padoka0 (trunk)
MSVC Compiler Version 19.00.24210

---

struct s {
   int a;
   int b;
   int c;
   int d;
   int e;
};

static const struct s str1 = {};           // gcc 5/6/7, clang 4/5 accept this 
without warning, MSVC2013 doesnt compile
(not Standard, will generate a warning with -Wpendantic, much prettier however)
static const struct s str2 = {0};          // clang 4/5 generate a warning here 
(although ANSI Standard)
static const struct s str3 = {0,};         // clang 4/5 generate a warning here 
(although ANSI Standard)
static const struct s str4 = {1,2,3};      // gcc 5/6/7, clang 4/5 generate a 
warning here
static const struct s str5 = {1,2,3,};     // gcc 5/6/7, clang 4/5 generate a 
warning here
static const struct s str6 = {1,2,3,0,0};  // this is fine with all compilers
static const struct s str7 = {.a = 1, .b = 2, .c = 3}; // this might not 
compile on MSVC <2013 but couldnt test

int main() {
   return 0;
}

---

This is what Rust does:

---

#![allow(unused_variables)]
#![allow(dead_code)]

#[derive(Default)]
struct Test {
   a: i32,
   b: i32,
   c: i32,
   d: i32,
   e: i32
}

fn main() {
//all of these wont work
//    let t1 = Test {};
//    let t2 = Test {0};
//    let t3 = Test {0,};
//    let t3b= Test {..}; would be very cool
//    let t4 = Test {1,2,3};
//    let t5 = Test {1,2,3,};
//    let t6 = Test {1,2,3,0,0};
//    let t7 = Test {a: 1, b: 1};
//    let t8 = Test {a: 1, b: 1, ..}; would be cool

//only this is legal in rust
    let t9: Test = Default::default();
    let t10 = Test {..Default::default()};
    let t11 = Test {a: 1, b: 1, ..Default::default()};
    let t12 = Test {a: 1, b: 1, c: 1, d: 1, e: 1};

    println!("Hello, world!");
}

---

So in the end I followed Emils suggestion of designated initializers for 
partial initialization,
to make it explicit and get rid of the warnings.

Please kindly review and push.

Thanks,
Benedikt

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to