Skip to content

Commit

Permalink
Refactor redundant/conflicting storage class handling
Browse files Browse the repository at this point in the history
Check redundant/conflicting attributes between prefix and postfix
  • Loading branch information
9rnsr committed Oct 2, 2014
1 parent 296548e commit 1b932b9
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 183 deletions.
223 changes: 83 additions & 140 deletions src/parse.c

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions src/parse.h
Expand Up @@ -78,9 +78,9 @@ class Parser : public Lexer
Dsymbols *parseDeclDefs(int once, Dsymbol **pLastDecl = NULL, PrefixAttributes *pAttrs = NULL);
Dsymbols *parseAutoDeclarations(StorageClass storageClass, const utf8_t *comment);
Dsymbols *parseBlock(Dsymbol **pLastDecl, PrefixAttributes *pAttrs = NULL);
void composeStorageClass(StorageClass stc);
StorageClass appendStorageClass(StorageClass storageClass, StorageClass stc);
StorageClass parseAttribute(Expressions **pexps);
StorageClass parsePostfix(Expressions **pudas);
StorageClass parsePostfix(StorageClass storageClass, Expressions **pudas);
StorageClass parseTypeCtor();
Expression *parseConstraint();
TemplateDeclaration *parseTemplateDeclaration(bool ismixin = false);
Expand Down
6 changes: 3 additions & 3 deletions test/fail_compilation/fail183.d
@@ -1,9 +1,9 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail183.d(10): Error: redundant storage class 'const'
fail_compilation/fail183.d(10): Error: redundant storage class 'scope'
fail_compilation/fail183.d(11): Error: redundant storage class 'in'
fail_compilation/fail183.d(10): Error: redundant attribute 'const'
fail_compilation/fail183.d(10): Error: redundant attribute 'scope'
fail_compilation/fail183.d(11): Error: redundant attribute 'in'
---
*/

Expand Down
2 changes: 1 addition & 1 deletion test/fail_compilation/fail184.d
@@ -1,7 +1,7 @@
/*
TEST_OUTPUT:
---
fail_compilation/fail184.d(8): Error: redundant storage class 'final'
fail_compilation/fail184.d(8): Error: redundant attribute 'final'
---
*/

Expand Down
12 changes: 6 additions & 6 deletions test/fail_compilation/parseStc.d
Expand Up @@ -2,7 +2,7 @@
TEST_OUTPUT:
---
fail_compilation/parseStc.d(10): Error: if (v; e) is deprecated, use if (auto v = e)
fail_compilation/parseStc.d(11): Error: redundant storage class 'const'
fail_compilation/parseStc.d(11): Error: redundant attribute 'const'
---
*/
void test1()
Expand All @@ -14,9 +14,9 @@ void test1()
/*
TEST_OUTPUT:
---
fail_compilation/parseStc.d(24): Error: redundant storage class 'const'
fail_compilation/parseStc.d(25): Error: redundant storage class 'const'
fail_compilation/parseStc.d(26): Error: conflicting storage class immutable
fail_compilation/parseStc.d(24): Error: redundant attribute 'const'
fail_compilation/parseStc.d(25): Error: redundant attribute 'const'
fail_compilation/parseStc.d(26): Error: conflicting attribute 'immutable'
---
*/
void test2()
Expand All @@ -29,8 +29,8 @@ void test2()
/*
TEST_OUTPUT:
---
fail_compilation/parseStc.d(36): Error: redundant storage class 'const'
fail_compilation/parseStc.d(37): Error: redundant storage class 'const'
fail_compilation/parseStc.d(36): Error: redundant attribute 'const'
fail_compilation/parseStc.d(37): Error: redundant attribute 'const'
---
*/
struct S3 { const const test3() {} }
Expand Down
18 changes: 9 additions & 9 deletions test/fail_compilation/parseStc2.d
@@ -1,11 +1,11 @@
/*
TEST_OUTPUT:
---
fail_compilation/parseStc2.d(11): Error: conflicting storage class const
fail_compilation/parseStc2.d(12): Error: conflicting attribute @system
fail_compilation/parseStc2.d(13): Error: conflicting attribute @safe
fail_compilation/parseStc2.d(14): Error: conflicting attribute @trusted
fail_compilation/parseStc2.d(15): Error: conflicting storage class __gshared
fail_compilation/parseStc2.d(11): Error: conflicting attribute 'const'
fail_compilation/parseStc2.d(12): Error: conflicting attribute '@system'
fail_compilation/parseStc2.d(13): Error: conflicting attribute '@safe'
fail_compilation/parseStc2.d(14): Error: conflicting attribute '@trusted'
fail_compilation/parseStc2.d(15): Error: conflicting attribute '__gshared'
---
*/
immutable const void f4() {}
Expand All @@ -17,10 +17,10 @@ shared __gshared f4() {}
/*
TEST_OUTPUT:
---
fail_compilation/parseStc2.d(26): Error: redundant storage class 'static'
fail_compilation/parseStc2.d(27): Error: redundant storage class 'pure'
fail_compilation/parseStc2.d(28): Error: redundant storage class '@property'
fail_compilation/parseStc2.d(29): Error: redundant storage class '@safe'
fail_compilation/parseStc2.d(26): Error: redundant attribute 'static'
fail_compilation/parseStc2.d(27): Error: redundant attribute 'pure'
fail_compilation/parseStc2.d(28): Error: redundant attribute '@property'
fail_compilation/parseStc2.d(29): Error: redundant attribute '@safe'
---
*/
static static void f1() {}
Expand Down
42 changes: 21 additions & 21 deletions test/fail_compilation/parseStc3.d
@@ -1,10 +1,10 @@
/*
TEST_OUTPUT:
---
fail_compilation/parseStc3.d(10): Error: redundant storage class 'pure'
fail_compilation/parseStc3.d(11): Error: redundant storage class 'nothrow'
fail_compilation/parseStc3.d(12): Error: redundant storage class '@nogc'
fail_compilation/parseStc3.d(13): Error: redundant storage class '@property'
fail_compilation/parseStc3.d(10): Error: redundant attribute 'pure'
fail_compilation/parseStc3.d(11): Error: redundant attribute 'nothrow'
fail_compilation/parseStc3.d(12): Error: redundant attribute '@nogc'
fail_compilation/parseStc3.d(13): Error: redundant attribute '@property'
---
*/
pure void f1() pure {}
Expand All @@ -16,9 +16,9 @@ nothrow void f2() nothrow {}
/*
TEST_OUTPUT:
---
fail_compilation/parseStc3.d(24): Error: redundant storage class '@safe'
fail_compilation/parseStc3.d(25): Error: redundant storage class '@system'
fail_compilation/parseStc3.d(26): Error: redundant storage class '@trusted'
fail_compilation/parseStc3.d(24): Error: redundant attribute '@safe'
fail_compilation/parseStc3.d(25): Error: redundant attribute '@system'
fail_compilation/parseStc3.d(26): Error: redundant attribute '@trusted'
---
*/
@safe void f6() @safe {}
Expand All @@ -28,12 +28,12 @@ fail_compilation/parseStc3.d(26): Error: redundant storage class '@trusted'
/*
TEST_OUTPUT:
---
fail_compilation/parseStc3.d(39): Error: conflicting storage class '@system'
fail_compilation/parseStc3.d(40): Error: conflicting storage class '@trusted'
fail_compilation/parseStc3.d(41): Error: conflicting storage class '@safe'
fail_compilation/parseStc3.d(42): Error: conflicting storage class '@trusted'
fail_compilation/parseStc3.d(43): Error: conflicting storage class '@safe'
fail_compilation/parseStc3.d(44): Error: conflicting storage class '@system'
fail_compilation/parseStc3.d(39): Error: conflicting attribute '@system'
fail_compilation/parseStc3.d(40): Error: conflicting attribute '@trusted'
fail_compilation/parseStc3.d(41): Error: conflicting attribute '@safe'
fail_compilation/parseStc3.d(42): Error: conflicting attribute '@trusted'
fail_compilation/parseStc3.d(43): Error: conflicting attribute '@safe'
fail_compilation/parseStc3.d(44): Error: conflicting attribute '@system'
---
*/
@safe void f9() @system {}
Expand All @@ -46,14 +46,14 @@ fail_compilation/parseStc3.d(44): Error: conflicting storage class '@system'
/*
TEST_OUTPUT:
---
fail_compilation/parseStc3.d(59): Error: conflicting attribute @system
fail_compilation/parseStc3.d(59): Error: conflicting storage class '@trusted'
fail_compilation/parseStc3.d(60): Error: conflicting attribute @system
fail_compilation/parseStc3.d(60): Error: redundant storage class '@system'
fail_compilation/parseStc3.d(61): Error: conflicting attribute @safe
fail_compilation/parseStc3.d(61): Error: redundant storage class '@system'
fail_compilation/parseStc3.d(62): Error: conflicting attribute @safe
fail_compilation/parseStc3.d(62): Error: redundant storage class '@trusted'
fail_compilation/parseStc3.d(59): Error: conflicting attribute '@system'
fail_compilation/parseStc3.d(59): Error: conflicting attribute '@trusted'
fail_compilation/parseStc3.d(60): Error: conflicting attribute '@system'
fail_compilation/parseStc3.d(60): Error: redundant attribute '@system'
fail_compilation/parseStc3.d(61): Error: conflicting attribute '@safe'
fail_compilation/parseStc3.d(61): Error: redundant attribute '@system'
fail_compilation/parseStc3.d(62): Error: conflicting attribute '@safe'
fail_compilation/parseStc3.d(62): Error: redundant attribute '@trusted'
---
*/
@safe @system void f15() @trusted {}
Expand Down
17 changes: 17 additions & 0 deletions test/fail_compilation/parseStc4.d
@@ -0,0 +1,17 @@

/*
TEST_OUTPUT:
---
fail_compilation/parseStc4.d(14): Error: redundant attribute 'pure'
fail_compilation/parseStc4.d(14): Error: redundant attribute 'nothrow'
fail_compilation/parseStc4.d(14): Error: conflicting attribute '@system'
fail_compilation/parseStc4.d(14): Error: redundant attribute '@nogc'
fail_compilation/parseStc4.d(14): Error: redundant attribute '@property'
---
*/
pure nothrow @safe @nogc @property
int foo()
pure nothrow @system @nogc @property
{
return 0;
}
2 changes: 1 addition & 1 deletion test/runnable/xtest46.d
Expand Up @@ -3685,7 +3685,7 @@ auto ref boo(int i) pure nothrow { return i; }

class A152 {
auto hoo(int i) pure { return i; }
const boo(int i) const { return i; }
const boo(int i) nothrow { return i; }
auto coo(int i) const { return i; }
auto doo(int i) immutable { return i; }
auto eoo(int i) shared { return i; }
Expand Down

0 comments on commit 1b932b9

Please sign in to comment.