[Mesa-dev] [PATCH v3 0/3] Fix missing initializer errors in generated tables

Benedikt Schemmer ben at besd.de
Sun Jun 11 17:17:03 UTC 2017


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



More information about the mesa-dev mailing list