diff --git a/hgext/sparse.py b/hgext/sparse.py
--- a/hgext/sparse.py
+++ b/hgext/sparse.py
@@ -35,8 +35,7 @@ to the repository root.
 
 The special lines ``[include]`` and ``[exclude]`` denote the section
 for includes and excludes that follow, respectively. It is illegal to
-have ``[include]`` after ``[exclude]``. If no sections are defined,
-entries are assumed to be in the ``[include]`` section.
+have ``[include]`` after ``[exclude]``.
 
 Non-special lines resemble file patterns to be added to either includes
 or excludes. The syntax of these lines is documented by :hg:`help patterns`.
diff --git a/mercurial/sparse.py b/mercurial/sparse.py
--- a/mercurial/sparse.py
+++ b/mercurial/sparse.py
@@ -33,8 +33,10 @@ def parseconfig(ui, raw):
     """
     includes = set()
     excludes = set()
-    current = includes
     profiles = set()
+    current = None
+    havesection = False
+
     for line in raw.split('\n'):
         line = line.strip()
         if not line or line.startswith('#'):
@@ -45,14 +47,23 @@ def parseconfig(ui, raw):
             if line:
                 profiles.add(line)
         elif line == '[include]':
-            if current != includes:
+            if havesection and current != includes:
                 # TODO pass filename into this API so we can report it.
                 raise error.Abort(_('sparse config cannot have includes ' +
                                     'after excludes'))
+            havesection = True
+            current = includes
             continue
         elif line == '[exclude]':
+            havesection = True
             current = excludes
         elif line:
+            if current is None:
+                raise error.Abort(_('sparse config entry outside of '
+                                    'section: %s') % line,
+                                  hint=_('add an [include] or [exclude] line '
+                                         'to declare the entry type'))
+
             if line.strip().startswith('/'):
                 ui.warn(_('warning: sparse profile cannot use' +
                           ' paths starting with /, ignoring %s\n') % line)
diff --git a/tests/test-sparse-profiles.t b/tests/test-sparse-profiles.t
--- a/tests/test-sparse-profiles.t
+++ b/tests/test-sparse-profiles.t
@@ -10,6 +10,18 @@ test sparse
   > rebase=
   > EOF
 
+Config file without [section] is rejected
+
+  $ cat > bad.sparse <<EOF
+  > *.html
+  > EOF
+
+  $ hg debugsparse --import-rules bad.sparse
+  abort: sparse config entry outside of section: *.html
+  (add an [include] or [exclude] line to declare the entry type)
+  [255]
+  $ rm bad.sparse
+
   $ echo a > index.html
   $ echo x > data.py
   $ echo z > readme.txt
@@ -257,6 +269,7 @@ Test file permissions changing across a 
   > EOF
   $ touch a b
   $ cat > .hgsparse <<EOF
+  > [include]
   > a
   > EOF
   $ hg commit -Aqm 'initial'