Proprietary compiler extensions can be handy, but they commit you to always using that compiler. This rule raises an issue when the following GNU extensions are used:


* A array initializer without ``++=++``, which has been obsolete since GCC 2.5
* A structure member initializer with a colon, which has been obsolete since GCC 2.5.
* Case ranges
* Ternary operator with omitted second operand


== Noncompliant Code Example

----
struct S {
  int f;
};

struct S s[] = {
  [0] { // Noncompliant
    f : 0 // Noncompliant
  }
};

int fun(int p) {
  switch (p) {
    case 0 ... 1: // Noncompliant
      do_the_thing();
      break;
    case 2:
      //...
  }

  return p ?: 0; // Noncompliant
}
----


== Compliant Solution

----
struct S {
  int f;
};

struct S s[] = {
  [0] = {
    .f = 0
  }
};

int fun(int p) {
  switch (p) {
    case 0:
    case 1:
      do_the_thing();
      break;
    case 2:
      //...
  }

  return p ? p: 0;
}
----

