https://issues.dlang.org/show_bug.cgi?id=12821
--- Comment #1 from Kenji Hara <[email protected]> --- By recent git-head change, many cases are properly fixed. final final void foo() { } // Error, redundant 'final' final shared final void foo() { } // Error, redundant 'final' final static final void foo() { } // Error, redundant 'final' <- OK static static void foo() { } // Error, redundant 'static' <- OK extern extern void foo() { } // Error, redundant 'extern' <- OK align align void foo() { } // Error, redundant 'align' <- OK shared shared void foo() { } // Error, redundant 'shared' shared static shared void foo() { } // Error, redundant 'shared' <- OK shared extern shared void foo() { } // Error, redundant 'shared' <- OK shared extern(D) shared void foo() { } // Error, redundant 'shared' <- OK shared align shared void foo() { } // Error, redundant 'shared' <- OK const const void foo() { } // Error, redundant 'const' protected protected void foo() { } // Error, redundant 'protection' const protected const void foo() { } // Error, redundant 'const' <- OK protected const protected void foo() { } // Error, redundant 'protection' <- OK const immutable void foo() { } // Error, conflicting const package immutable void foo() { } // Error, conflicting <- OK const static immutable void foo() { } // Error, conflicting <- OK These are still OK cases: debug debug void foo() { } // OK shared debug shared void foo() { } // OK Currently it's intended. Because `debug ...` is parsed as ConditionalDeclaration, so they are equivalent with: debug { debug { void foo() { } } } shared { debug { shared { void foo() { } } } } --
