diff --git a/src/parse.c b/src/parse.c
index dcc2c4f..86ed2a8 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -219,6 +219,27 @@ struct PrefixAttributes
     }
 };
 
+static bool isGoodAttr (TOK v) {
+  switch (v) {
+    case TOKnothrow:
+    case TOKpure:
+      return true;
+  }
+  return false;
+}
+
+// return true if something like '@nothrow' is found
+// `token` is at '@' here
+// eats '@' if 'good' attribute name found
+bool Parser::isExAttribute()
+{
+  if (isGoodAttr(peekNext())) {
+    nextToken(); // eat '@'
+    return true;
+  }
+  return false;
+}
+
 Dsymbols *Parser::parseDeclDefs(int once, Dsymbol **pLastDecl, PrefixAttributes *pAttrs)
 {
     Dsymbol *lastDecl = NULL;   // used to link unittest to its previous declaration
@@ -247,6 +268,7 @@ Dsymbols *Parser::parseDeclDefs(int once, Dsymbol **pLastDecl, PrefixAttributes
 
         linkage = linksave;
 
+      Lattagain:
         switch (token.value)
         {
             case TOKenum:
@@ -491,6 +513,7 @@ Dsymbols *Parser::parseDeclDefs(int once, Dsymbol **pLastDecl, PrefixAttributes
             case TOKat:
             {
                 Expressions *exps = NULL;
+                if (isExAttribute()) goto Lattagain;
                 stc = parseAttribute(&exps);
                 if (stc)
                     goto Lstc;                  // it's a predefined attribute
@@ -1003,6 +1026,7 @@ StorageClass Parser::parsePostfix(Expressions **pudas)
 
     while (1)
     {
+      Lattagain:
         switch (token.value)
         {
             case TOKconst:              stc |= STCconst;                break;
@@ -1014,6 +1038,7 @@ StorageClass Parser::parsePostfix(Expressions **pudas)
             case TOKat:
             {
                 Expressions *udas = NULL;
+                if (isExAttribute()) goto Lattagain;
                 stc |= parseAttribute(&udas);
                 if (udas)
                 {
@@ -3241,6 +3266,7 @@ void Parser::parseStorageClasses(StorageClass &storage_class, LINK &link, unsign
 
     while (1)
     {
+      Lattagain:
         switch (token.value)
         {
             case TOKconst:
@@ -3282,6 +3308,7 @@ void Parser::parseStorageClasses(StorageClass &storage_class, LINK &link, unsign
             case TOKenum:       stc = STCmanifest;       goto L1;
             case TOKat:
             {
+                if (isExAttribute()) goto Lattagain;
                 stc = parseAttribute(&udas);
                 if (stc)
                     goto L1;
@@ -4314,6 +4341,7 @@ Statement *Parser::parseStatement(int flags, const utf8_t** endPtr)
     if (flags & PScurly && token.value != TOKlcurly)
         error("statement expected to be { }, not %s", token.toChars());
 
+  Lattagain:
     switch (token.value)
     {
         case TOKidentifier:
@@ -4470,6 +4498,7 @@ Statement *Parser::parseStatement(int flags, const utf8_t** endPtr)
         case TOKinterface:
         Ldeclaration:
         {
+            if (token.value == TOKat && isExAttribute()) goto Lattagain;
             Dsymbols *a = parseDeclarations(false, NULL, NULL);
             if (a->dim > 1)
             {
@@ -6082,7 +6111,8 @@ int Parser::skipAttributes(Token *t, Token **pt)
                         t->ident == Id::safe ||
                         t->ident == Id::trusted ||
                         t->ident == Id::system ||
-                        t->ident == Id::disable)
+                        t->ident == Id::disable ||
+                        isGoodAttr(t->value))
                         break;
                     t = peek(t);
                     if (t->value == TOKnot)
diff --git a/src/parse.h b/src/parse.h
index 9e6141c..db72651 100644
--- a/src/parse.h
+++ b/src/parse.h
@@ -75,6 +75,7 @@ public:
     Parser(Module *module, const utf8_t *base, size_t length, int doDocComment);
 
     Dsymbols *parseModule();
+    bool isExAttribute();
     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);
