diff --git a/std/d/ast.d b/std/d/ast.d
index 8549aa0..8490f50 100644
--- a/std/d/ast.d
+++ b/std/d/ast.d
@@ -469,6 +469,8 @@ public:
     }
     mixin OpEquals;
     /** */ AssignExpression[] items;
+    /** */ size_t startLocation;
+    /** */ size_t endLocation;
 }
 
 ///
@@ -745,6 +747,8 @@ public:
     /** */ FunctionCallExpression functionCallExpression;
     /** */ ArgumentList argumentList;
     /** */ Token identifier;
+    /** */ size_t startLocation;
+    /** */ size_t endLocation;
     mixin OpEquals;
 }
 
@@ -1978,6 +1982,8 @@ public:
         mixin (visitIfNotNull!(moduleName));
     }
     /** */ IdentifierChain moduleName;
+    /** */ size_t startLocation;
+    /** */ size_t endLocation;
     mixin OpEquals;
 }
 
diff --git a/std/d/parser.d b/std/d/parser.d
index ad47494..08da2e0 100644
--- a/std/d/parser.d
+++ b/std/d/parser.d
@@ -273,7 +273,11 @@ alias core.sys.posix.stdio.fileno fileno;
     ArgumentList parseArgumentList()
     {
         mixin(traceEnterAndExit!(__FUNCTION__));
-        return parseCommaSeparatedRule!(ArgumentList, AssignExpression)(true);
+        size_t startLocation = current().index;
+        auto ret= parseCommaSeparatedRule!(ArgumentList, AssignExpression)(true);
+        ret.startLocation = startLocation;
+        ret.endLocation = current().index;
+        return ret;
     }
 
     /**
@@ -717,7 +721,9 @@ alias core.sys.posix.stdio.fileno fileno;
     {
         mixin(traceEnterAndExit!(__FUNCTION__));
         auto node = allocate!AtAttribute;
-        if (expect(tok!"@") is null) return null;
+        auto start = expect(tok!"@");
+        if (start is null) return null;
+        node.startLocation = start.index;
         switch (current.type)
         {
         case tok!"identifier":
@@ -735,6 +741,7 @@ alias core.sys.posix.stdio.fileno fileno;
             error(`"(", or identifier expected`);
             return null;
         }
+        node.endLocation = current().index;
         return node;
     }
 
@@ -3601,9 +3608,11 @@ invariant() foo();
     ModuleDeclaration parseModuleDeclaration()
     {
         auto node = allocate!ModuleDeclaration;
-        expect(tok!"module");
+        auto start = expect(tok!"module");
         node.moduleName = parseIdentifierChain();
-        expect(tok!";");
+        auto end = expect(tok!";");
+        node.startLocation = start.index;
+        node.endLocation = end.index;
         return node;
     }