From fb632c747d953d615575850477d4662802be320f Mon Sep 17 00:00:00 2001
From: Avi Dessauer <avi.the.coder@gmail.com>
Date: Wed, 3 Jun 2020 15:21:47 -0400
Subject: Parse default unsafe & default const

---
 crates/ra_parser/src/grammar/items.rs              | 26 ++++++++++++++++-
 .../parser/inline/err/0010_wrong_order_fns.rast    | 34 +++++++++++++---------
 2 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index 67a924de5..41f8bb0b6 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -118,7 +118,15 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         && p.at_contextual_kw("default")
         && (match p.nth(1) {
             T![impl] => true,
-            T![fn] | T![type] => {
+            T![unsafe] => {
+                if T![impl] == p.nth(2) {
+                    p.bump_remap(T![default]);
+                    p.bump_remap(T![unsafe]);
+                    has_mods = true;
+                }
+                false
+            }
+            T![fn] | T![type] | T![const] => {
                 if let ItemFlavor::Mod = flavor {
                     true
                 } else {
@@ -187,6 +195,9 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         // test default_impl
         // default impl Foo {}
 
+        // test default_unsafe_impl
+        // default unsafe impl Foo {}
+
         // test_err default_fn_type
         // trait T {
         //     default type T = Bar;
@@ -199,6 +210,19 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         //     default fn foo() {}
         // }
 
+        // test_err default_const
+        // trait T {
+        //   default const f: u8 = 0;
+        // }
+
+        // test default_const
+        // impl T for Foo {
+        //   default const f: u8 = 0;
+        // }
+        T![const] => {
+            consts::const_def(p, m);
+        }
+
         // test unsafe_default_impl
         // unsafe default impl Foo {}
         T![impl] => {
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast b/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast
index 9be441110..53f7ebaf9 100644
--- a/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast
+++ b/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast
@@ -17,23 +17,29 @@ SOURCE_FILE@0..50
       L_CURLY@22..23 "{"
       R_CURLY@23..24 "}"
   WHITESPACE@24..25 "\n"
-  ERROR@25..31
+  CONST_DEF@25..46
     UNSAFE_KW@25..31 "unsafe"
-  WHITESPACE@31..32 " "
-  FN_DEF@32..49
+    WHITESPACE@31..32 " "
     CONST_KW@32..37 "const"
     WHITESPACE@37..38 " "
-    FN_KW@38..40 "fn"
+    ERROR@38..40
+      FN_KW@38..40 "fn"
     WHITESPACE@40..41 " "
-    NAME@41..44
-      IDENT@41..44 "bar"
-    PARAM_LIST@44..46
-      L_PAREN@44..45 "("
-      R_PAREN@45..46 ")"
-    WHITESPACE@46..47 " "
-    BLOCK_EXPR@47..49
-      L_CURLY@47..48 "{"
-      R_CURLY@48..49 "}"
+    PATH_TYPE@41..46
+      PATH@41..46
+        PATH_SEGMENT@41..46
+          NAME_REF@41..44
+            IDENT@41..44 "bar"
+          PARAM_LIST@44..46
+            L_PAREN@44..45 "("
+            R_PAREN@45..46 ")"
+  WHITESPACE@46..47 " "
+  ERROR@47..49
+    L_CURLY@47..48 "{"
+    R_CURLY@48..49 "}"
   WHITESPACE@49..50 "\n"
 error 6..6: expected existential, fn, trait or impl
-error 31..31: expected existential, fn, trait or impl
+error 38..38: expected a name
+error 40..40: expected COLON
+error 46..46: expected SEMICOLON
+error 47..47: expected an item
-- 
cgit v1.2.3


From a5588b9e19cbbc18b1afd9afcc9bab2bce2b711c Mon Sep 17 00:00:00 2001
From: Avi Dessauer <avi.the.coder@gmail.com>
Date: Wed, 3 Jun 2020 20:39:57 -0400
Subject: Update tests

---
 .../parser/inline/err/0015_default_const.rast      | 40 ++++++++++++++++++++
 .../parser/inline/err/0015_default_const.rs        |  3 ++
 .../parser/inline/ok/0162_default_const.rast       | 44 ++++++++++++++++++++++
 .../parser/inline/ok/0162_default_const.rs         |  3 ++
 .../parser/inline/ok/0163_default_unsafe_impl.rast | 18 +++++++++
 .../parser/inline/ok/0163_default_unsafe_impl.rs   |  1 +
 6 files changed, 109 insertions(+)
 create mode 100644 crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast
 create mode 100644 crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs
 create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast
 create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs
 create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast
 create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs

diff --git a/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast b/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast
new file mode 100644
index 000000000..8eb583ef8
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast
@@ -0,0 +1,40 @@
+SOURCE_FILE@0..39
+  TRAIT_DEF@0..38
+    TRAIT_KW@0..5 "trait"
+    WHITESPACE@5..6 " "
+    NAME@6..7
+      IDENT@6..7 "T"
+    WHITESPACE@7..8 " "
+    ITEM_LIST@8..38
+      L_CURLY@8..9 "{"
+      WHITESPACE@9..12 "\n  "
+      MACRO_CALL@12..19
+        PATH@12..19
+          PATH_SEGMENT@12..19
+            NAME_REF@12..19
+              IDENT@12..19 "default"
+      WHITESPACE@19..20 " "
+      CONST_DEF@20..36
+        CONST_KW@20..25 "const"
+        WHITESPACE@25..26 " "
+        NAME@26..27
+          IDENT@26..27 "f"
+        COLON@27..28 ":"
+        WHITESPACE@28..29 " "
+        PATH_TYPE@29..31
+          PATH@29..31
+            PATH_SEGMENT@29..31
+              NAME_REF@29..31
+                IDENT@29..31 "u8"
+        WHITESPACE@31..32 " "
+        EQ@32..33 "="
+        WHITESPACE@33..34 " "
+        LITERAL@34..35
+          INT_NUMBER@34..35 "0"
+        SEMICOLON@35..36 ";"
+      WHITESPACE@36..37 "\n"
+      R_CURLY@37..38 "}"
+  WHITESPACE@38..39 "\n"
+error 19..19: expected BANG
+error 19..19: expected `{`, `[`, `(`
+error 19..19: expected SEMICOLON
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs b/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs
new file mode 100644
index 000000000..80f15474a
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs
@@ -0,0 +1,3 @@
+trait T {
+  default const f: u8 = 0;
+}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast b/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast
new file mode 100644
index 000000000..dab0247ee
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast
@@ -0,0 +1,44 @@
+SOURCE_FILE@0..46
+  IMPL_DEF@0..45
+    IMPL_KW@0..4 "impl"
+    WHITESPACE@4..5 " "
+    PATH_TYPE@5..6
+      PATH@5..6
+        PATH_SEGMENT@5..6
+          NAME_REF@5..6
+            IDENT@5..6 "T"
+    WHITESPACE@6..7 " "
+    FOR_KW@7..10 "for"
+    WHITESPACE@10..11 " "
+    PATH_TYPE@11..14
+      PATH@11..14
+        PATH_SEGMENT@11..14
+          NAME_REF@11..14
+            IDENT@11..14 "Foo"
+    WHITESPACE@14..15 " "
+    ITEM_LIST@15..45
+      L_CURLY@15..16 "{"
+      WHITESPACE@16..19 "\n  "
+      CONST_DEF@19..43
+        DEFAULT_KW@19..26 "default"
+        WHITESPACE@26..27 " "
+        CONST_KW@27..32 "const"
+        WHITESPACE@32..33 " "
+        NAME@33..34
+          IDENT@33..34 "f"
+        COLON@34..35 ":"
+        WHITESPACE@35..36 " "
+        PATH_TYPE@36..38
+          PATH@36..38
+            PATH_SEGMENT@36..38
+              NAME_REF@36..38
+                IDENT@36..38 "u8"
+        WHITESPACE@38..39 " "
+        EQ@39..40 "="
+        WHITESPACE@40..41 " "
+        LITERAL@41..42
+          INT_NUMBER@41..42 "0"
+        SEMICOLON@42..43 ";"
+      WHITESPACE@43..44 "\n"
+      R_CURLY@44..45 "}"
+  WHITESPACE@45..46 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs b/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs
new file mode 100644
index 000000000..dfb3b92dc
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs
@@ -0,0 +1,3 @@
+impl T for Foo {
+  default const f: u8 = 0;
+}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast
new file mode 100644
index 000000000..a9eda5668
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast
@@ -0,0 +1,18 @@
+SOURCE_FILE@0..27
+  IMPL_DEF@0..26
+    DEFAULT_KW@0..7 "default"
+    WHITESPACE@7..8 " "
+    UNSAFE_KW@8..14 "unsafe"
+    WHITESPACE@14..15 " "
+    IMPL_KW@15..19 "impl"
+    WHITESPACE@19..20 " "
+    PATH_TYPE@20..23
+      PATH@20..23
+        PATH_SEGMENT@20..23
+          NAME_REF@20..23
+            IDENT@20..23 "Foo"
+    WHITESPACE@23..24 " "
+    ITEM_LIST@24..26
+      L_CURLY@24..25 "{"
+      R_CURLY@25..26 "}"
+  WHITESPACE@26..27 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs
new file mode 100644
index 000000000..ba0998ff4
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs
@@ -0,0 +1 @@
+default unsafe impl Foo {}
-- 
cgit v1.2.3


From 3ec2dcfc0d7ea7d9fb9c499616e9eca06b5c865b Mon Sep 17 00:00:00 2001
From: Avi Dessauer <avi.the.coder@gmail.com>
Date: Thu, 4 Jun 2020 13:00:21 -0400
Subject: Address review

---
 crates/ra_parser/src/grammar/items.rs | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index 41f8bb0b6..0d3568e5f 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -119,9 +119,11 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         && (match p.nth(1) {
             T![impl] => true,
             T![unsafe] => {
-                if T![impl] == p.nth(2) {
+                // test default_unsafe_impl
+                // default unsafe impl Foo {}
+                if p.nth(2) == T![impl] {
                     p.bump_remap(T![default]);
-                    p.bump_remap(T![unsafe]);
+                    p.bump(T![unsafe]);
                     has_mods = true;
                 }
                 false
@@ -195,9 +197,6 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         // test default_impl
         // default impl Foo {}
 
-        // test default_unsafe_impl
-        // default unsafe impl Foo {}
-
         // test_err default_fn_type
         // trait T {
         //     default type T = Bar;
-- 
cgit v1.2.3


From c4fd46398132a409d7947141094d7301c0f0af73 Mon Sep 17 00:00:00 2001
From: Avi Dessauer <avi.the.coder@gmail.com>
Date: Thu, 4 Jun 2020 13:06:26 -0400
Subject: Move default const test out of line

---
 crates/ra_parser/src/grammar/items.rs              | 10 -----
 .../test_data/parser/err/0043_default_const.rast   | 40 ++++++++++++++++++++
 .../test_data/parser/err/0043_default_const.rs     |  3 ++
 .../parser/inline/err/0015_default_const.rast      | 40 --------------------
 .../parser/inline/err/0015_default_const.rs        |  3 --
 .../parser/inline/ok/0162_default_const.rast       | 44 ----------------------
 .../parser/inline/ok/0162_default_const.rs         |  3 --
 .../test_data/parser/ok/0066_default_const.rast    | 44 ++++++++++++++++++++++
 .../test_data/parser/ok/0066_default_const.rs      |  3 ++
 9 files changed, 90 insertions(+), 100 deletions(-)
 create mode 100644 crates/ra_syntax/test_data/parser/err/0043_default_const.rast
 create mode 100644 crates/ra_syntax/test_data/parser/err/0043_default_const.rs
 delete mode 100644 crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast
 delete mode 100644 crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs
 delete mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast
 delete mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs
 create mode 100644 crates/ra_syntax/test_data/parser/ok/0066_default_const.rast
 create mode 100644 crates/ra_syntax/test_data/parser/ok/0066_default_const.rs

diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index 0d3568e5f..9c14b954a 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -208,16 +208,6 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
         //     default type T = Bar;
         //     default fn foo() {}
         // }
-
-        // test_err default_const
-        // trait T {
-        //   default const f: u8 = 0;
-        // }
-
-        // test default_const
-        // impl T for Foo {
-        //   default const f: u8 = 0;
-        // }
         T![const] => {
             consts::const_def(p, m);
         }
diff --git a/crates/ra_syntax/test_data/parser/err/0043_default_const.rast b/crates/ra_syntax/test_data/parser/err/0043_default_const.rast
new file mode 100644
index 000000000..8eb583ef8
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0043_default_const.rast
@@ -0,0 +1,40 @@
+SOURCE_FILE@0..39
+  TRAIT_DEF@0..38
+    TRAIT_KW@0..5 "trait"
+    WHITESPACE@5..6 " "
+    NAME@6..7
+      IDENT@6..7 "T"
+    WHITESPACE@7..8 " "
+    ITEM_LIST@8..38
+      L_CURLY@8..9 "{"
+      WHITESPACE@9..12 "\n  "
+      MACRO_CALL@12..19
+        PATH@12..19
+          PATH_SEGMENT@12..19
+            NAME_REF@12..19
+              IDENT@12..19 "default"
+      WHITESPACE@19..20 " "
+      CONST_DEF@20..36
+        CONST_KW@20..25 "const"
+        WHITESPACE@25..26 " "
+        NAME@26..27
+          IDENT@26..27 "f"
+        COLON@27..28 ":"
+        WHITESPACE@28..29 " "
+        PATH_TYPE@29..31
+          PATH@29..31
+            PATH_SEGMENT@29..31
+              NAME_REF@29..31
+                IDENT@29..31 "u8"
+        WHITESPACE@31..32 " "
+        EQ@32..33 "="
+        WHITESPACE@33..34 " "
+        LITERAL@34..35
+          INT_NUMBER@34..35 "0"
+        SEMICOLON@35..36 ";"
+      WHITESPACE@36..37 "\n"
+      R_CURLY@37..38 "}"
+  WHITESPACE@38..39 "\n"
+error 19..19: expected BANG
+error 19..19: expected `{`, `[`, `(`
+error 19..19: expected SEMICOLON
diff --git a/crates/ra_syntax/test_data/parser/err/0043_default_const.rs b/crates/ra_syntax/test_data/parser/err/0043_default_const.rs
new file mode 100644
index 000000000..80f15474a
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0043_default_const.rs
@@ -0,0 +1,3 @@
+trait T {
+  default const f: u8 = 0;
+}
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast b/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast
deleted file mode 100644
index 8eb583ef8..000000000
--- a/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rast
+++ /dev/null
@@ -1,40 +0,0 @@
-SOURCE_FILE@0..39
-  TRAIT_DEF@0..38
-    TRAIT_KW@0..5 "trait"
-    WHITESPACE@5..6 " "
-    NAME@6..7
-      IDENT@6..7 "T"
-    WHITESPACE@7..8 " "
-    ITEM_LIST@8..38
-      L_CURLY@8..9 "{"
-      WHITESPACE@9..12 "\n  "
-      MACRO_CALL@12..19
-        PATH@12..19
-          PATH_SEGMENT@12..19
-            NAME_REF@12..19
-              IDENT@12..19 "default"
-      WHITESPACE@19..20 " "
-      CONST_DEF@20..36
-        CONST_KW@20..25 "const"
-        WHITESPACE@25..26 " "
-        NAME@26..27
-          IDENT@26..27 "f"
-        COLON@27..28 ":"
-        WHITESPACE@28..29 " "
-        PATH_TYPE@29..31
-          PATH@29..31
-            PATH_SEGMENT@29..31
-              NAME_REF@29..31
-                IDENT@29..31 "u8"
-        WHITESPACE@31..32 " "
-        EQ@32..33 "="
-        WHITESPACE@33..34 " "
-        LITERAL@34..35
-          INT_NUMBER@34..35 "0"
-        SEMICOLON@35..36 ";"
-      WHITESPACE@36..37 "\n"
-      R_CURLY@37..38 "}"
-  WHITESPACE@38..39 "\n"
-error 19..19: expected BANG
-error 19..19: expected `{`, `[`, `(`
-error 19..19: expected SEMICOLON
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs b/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs
deleted file mode 100644
index 80f15474a..000000000
--- a/crates/ra_syntax/test_data/parser/inline/err/0015_default_const.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-trait T {
-  default const f: u8 = 0;
-}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast b/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast
deleted file mode 100644
index dab0247ee..000000000
--- a/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rast
+++ /dev/null
@@ -1,44 +0,0 @@
-SOURCE_FILE@0..46
-  IMPL_DEF@0..45
-    IMPL_KW@0..4 "impl"
-    WHITESPACE@4..5 " "
-    PATH_TYPE@5..6
-      PATH@5..6
-        PATH_SEGMENT@5..6
-          NAME_REF@5..6
-            IDENT@5..6 "T"
-    WHITESPACE@6..7 " "
-    FOR_KW@7..10 "for"
-    WHITESPACE@10..11 " "
-    PATH_TYPE@11..14
-      PATH@11..14
-        PATH_SEGMENT@11..14
-          NAME_REF@11..14
-            IDENT@11..14 "Foo"
-    WHITESPACE@14..15 " "
-    ITEM_LIST@15..45
-      L_CURLY@15..16 "{"
-      WHITESPACE@16..19 "\n  "
-      CONST_DEF@19..43
-        DEFAULT_KW@19..26 "default"
-        WHITESPACE@26..27 " "
-        CONST_KW@27..32 "const"
-        WHITESPACE@32..33 " "
-        NAME@33..34
-          IDENT@33..34 "f"
-        COLON@34..35 ":"
-        WHITESPACE@35..36 " "
-        PATH_TYPE@36..38
-          PATH@36..38
-            PATH_SEGMENT@36..38
-              NAME_REF@36..38
-                IDENT@36..38 "u8"
-        WHITESPACE@38..39 " "
-        EQ@39..40 "="
-        WHITESPACE@40..41 " "
-        LITERAL@41..42
-          INT_NUMBER@41..42 "0"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..44 "\n"
-      R_CURLY@44..45 "}"
-  WHITESPACE@45..46 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs b/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs
deleted file mode 100644
index dfb3b92dc..000000000
--- a/crates/ra_syntax/test_data/parser/inline/ok/0162_default_const.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-impl T for Foo {
-  default const f: u8 = 0;
-}
diff --git a/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast
new file mode 100644
index 000000000..dab0247ee
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast
@@ -0,0 +1,44 @@
+SOURCE_FILE@0..46
+  IMPL_DEF@0..45
+    IMPL_KW@0..4 "impl"
+    WHITESPACE@4..5 " "
+    PATH_TYPE@5..6
+      PATH@5..6
+        PATH_SEGMENT@5..6
+          NAME_REF@5..6
+            IDENT@5..6 "T"
+    WHITESPACE@6..7 " "
+    FOR_KW@7..10 "for"
+    WHITESPACE@10..11 " "
+    PATH_TYPE@11..14
+      PATH@11..14
+        PATH_SEGMENT@11..14
+          NAME_REF@11..14
+            IDENT@11..14 "Foo"
+    WHITESPACE@14..15 " "
+    ITEM_LIST@15..45
+      L_CURLY@15..16 "{"
+      WHITESPACE@16..19 "\n  "
+      CONST_DEF@19..43
+        DEFAULT_KW@19..26 "default"
+        WHITESPACE@26..27 " "
+        CONST_KW@27..32 "const"
+        WHITESPACE@32..33 " "
+        NAME@33..34
+          IDENT@33..34 "f"
+        COLON@34..35 ":"
+        WHITESPACE@35..36 " "
+        PATH_TYPE@36..38
+          PATH@36..38
+            PATH_SEGMENT@36..38
+              NAME_REF@36..38
+                IDENT@36..38 "u8"
+        WHITESPACE@38..39 " "
+        EQ@39..40 "="
+        WHITESPACE@40..41 " "
+        LITERAL@41..42
+          INT_NUMBER@41..42 "0"
+        SEMICOLON@42..43 ";"
+      WHITESPACE@43..44 "\n"
+      R_CURLY@44..45 "}"
+  WHITESPACE@45..46 "\n"
diff --git a/crates/ra_syntax/test_data/parser/ok/0066_default_const.rs b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rs
new file mode 100644
index 000000000..dfb3b92dc
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rs
@@ -0,0 +1,3 @@
+impl T for Foo {
+  default const f: u8 = 0;
+}
-- 
cgit v1.2.3