diff --git a/lib/Adt/AdtDialect.cpp b/lib/Adt/AdtDialect.cpp
index 099c6c38ac36a533f13ed6a59b54e348be6abd82..19f952dff4a9b20f8fe9ca835836edd839ed1455 100644
--- a/lib/Adt/AdtDialect.cpp
+++ b/lib/Adt/AdtDialect.cpp
@@ -76,7 +76,7 @@ public:
         SMLoc typeLoc = parser.getCurrentLocation();
         SmallVector<TypeSource> fieldTys;
         TypeSource someType;
-        if (parser.parseCommaSeparatedList(DialectAsmParser::Delimiter::OptionalLessGreater,
+        if (parser.parseCommaSeparatedList(DialectAsmParser::Delimiter::LessGreater,
                                            [&]() -> ParseResult {
                                                /*if (parser.parseType(someType))
                                                    return failure();*/
@@ -85,7 +85,7 @@ public:
                                                return success();
                                            }))
         {
-            parser.emitError(typeLoc, "error ");
+            parser.emitError(typeLoc, "failed to parse a list of field types");
             return ErrorSrcType();
         }
 
@@ -101,10 +101,10 @@ public:
     BasicSrcType(mlir::Type baseTy) : _baseTy(baseTy) {}
 
     static TypeSource parseType(::mlir::DialectAsmParser &parser) {
-        SMLoc typeLoc = parser.getCurrentLocation();
         mlir::Type baseTy;
         if (parser.parseLess() || parser.parseType(baseTy) || parser.parseGreater()) {
-            parser.emitError(typeLoc, "error while parsing base type");
+            SMLoc loc = parser.getCurrentLocation();
+            parser.emitError(loc, "error while parsing base type");
             return ErrorSrcType();
         }
         return BasicSrcType(baseTy);
@@ -121,14 +121,11 @@ public:
     SumSrcType(SmallVector<Variant> variants) : _variants(variants) {}
 
     static TypeSource parseType(::mlir::DialectAsmParser &parser) {
-        SMLoc typeLoc = parser.getCurrentLocation();
         SmallVector<Variant> variants;
         Variant someVariant;
-        if (parser.parseCommaSeparatedList(DialectAsmParser::Delimiter::OptionalLessGreater,
+        if (parser.parseCommaSeparatedList(DialectAsmParser::Delimiter::LessGreater,
                                            [&]() -> ParseResult {
-                                               if (failed(parser.parseKeyword(&someVariant.tag)))
-                                                   return failure();
-                                               if (parser.parseColon())
+                                               if (parser.parseKeyword(&someVariant.tag) || parser.parseColon())
                                                    return failure();
                                                /*if (parser.parseType(someVariant.ty))
                                                    return failure();*/
@@ -137,7 +134,7 @@ public:
                                                return success();
                                            }))
         {
-            parser.emitError(typeLoc, "error ");
+            parser.emitError(parser.getCurrentLocation(), "failed to parse a list of variants");
             return ErrorSrcType();
         }
 
@@ -146,24 +143,26 @@ public:
 };
 
 TypeSource TypeSource::parseType(::mlir::DialectAsmParser &parser) {
-    SMLoc typeLoc = parser.getCurrentLocation();
     StringRef keyword;
     if (/*parser.parseLess() ||*/ parser.parseKeyword(&keyword)) {
-        parser.emitError(typeLoc, "error while parsing type keyword");
+        parser.emitError(parser.getCurrentLocation(), "error while parsing type keyword");
         return ErrorSrcType();
     }
     TypeSource ty;
     if (keyword == "product") {
+        llvm::errs() << "This is a product type.\n";
         ty = ProductSrcType::parseType(parser);
     }
     else if (keyword == "sum") {
+        llvm::errs() << "This is a sum type.\n";
         ty = SumSrcType::parseType(parser);
     }
     else if (keyword == "basic") {
+        llvm::errs() << "This is a basic type.\n";
         ty = BasicSrcType::parseType(parser);
     }
     else {
-        parser.emitError(typeLoc, "hey, that's not OK");
+        parser.emitError(parser.getCurrentLocation(), "hey, that's not OK");
         return ErrorSrcType();
     }
     /*if (parser.parseGreater())
@@ -173,10 +172,9 @@ TypeSource TypeSource::parseType(::mlir::DialectAsmParser &parser) {
 
 
 TypeMem TypeMem::parseType(::mlir::DialectAsmParser &parser){
-    SMLoc typeLoc = parser.getCurrentLocation();
     StringRef keyword;
     if (parser.parseKeyword(&keyword)) {
-        parser.emitError(typeLoc, "error ");
+        parser.emitError(parser.getCurrentLocation(), "failed to parse a keyword");
         return TypeMem();
     }
     if (keyword == "i")
@@ -186,7 +184,7 @@ TypeMem TypeMem::parseType(::mlir::DialectAsmParser &parser){
     if (keyword == "Ptr")
         return PtrMemType::parseType(parser);
     else {
-        parser.emitError(typeLoc, "error ");
+        parser.emitError(parser.getCurrentLocation(), "unknown keyword");
         return TypeMem();
     }
 }
@@ -194,9 +192,8 @@ TypeMem TypeMem::parseType(::mlir::DialectAsmParser &parser){
 TypeMem IntMemType::parseType(::mlir::DialectAsmParser &parser){
     IntMemType memType;
     int64_t size;
-    SMLoc typeLoc = parser.getCurrentLocation();
     if (parser.parseInteger(size)){
-        parser.emitError(typeLoc, "error ");
+        parser.emitError(parser.getCurrentLocation(), "failed to parse an integer size");
         return memType;
     }
     memType.setWidth(size);
@@ -206,9 +203,8 @@ TypeMem IntMemType::parseType(::mlir::DialectAsmParser &parser){
 TypeMem WordMemType::parseType(::mlir::DialectAsmParser &parser) {
     WordMemType memType;
     int64_t size;
-    SMLoc typeLoc = parser.getCurrentLocation();
     if (parser.parseInteger(size)){
-        parser.emitError(typeLoc, "error ");
+        parser.emitError(parser.getCurrentLocation(), "failed to parse a word size");
         return memType;
     }
     memType.setWidth(size);
@@ -222,10 +218,9 @@ TypeMem PtrMemType::parseType(::mlir::DialectAsmParser &parser) {
 
 mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const {
     StringRef keyword;
-    SMLoc typeLoc = parser.getCurrentLocation();
     llvm::errs() << "I am parsing a type!\n";
     if (parser.parseKeyword(&keyword) || parser.parseLess()) {
-        parser.emitError(typeLoc, "error ");
+        parser.emitError(parser.getCurrentLocation(), "failed to parse <type");
         return Type();
     }
     else if (keyword == "type") {
@@ -233,7 +228,7 @@ mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const {
         TypeSource adtTypeSrc = TypeSource::parseType(parser);
         llvm::errs() << "I parsed a source type and didn't die.\n";
         if(parser.parseKeyword(&keyword) || keyword != "representedAs") {
-            parser.emitError(typeLoc, "error ");
+            parser.emitError(parser.getCurrentLocation(), "failed to parse representedAs");
             return Type();
         }
         else {
@@ -243,7 +238,7 @@ mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const {
             AdtType ty = AdtType::get(parser.getContext(), adtTypeSrc, adtTypeMem);
             llvm::errs() << "I built an AdtType.\n";
             if (parser.parseGreater()) {
-                parser.emitError(typeLoc, "error");
+                parser.emitError(parser.getCurrentLocation(), "failed to parse >");
                 return Type();
             }
             llvm::errs() << "Bye!\n";
@@ -251,7 +246,7 @@ mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const {
         }
     }
     else {
-        parser.emitError(typeLoc, "error ");
+        parser.emitError(parser.getCurrentLocation(), "failed to parse an src-mem type pair");
         return Type();
     }
 }
diff --git a/test/Adt/Dummy.mlir b/test/Adt/Dummy.mlir
index 18da9c03c0f47fa36e67f3783617bd98343503ec..15377cb67c1169138b0db83aae9a55ebba501965 100644
--- a/test/Adt/Dummy.mlir
+++ b/test/Adt/Dummy.mlir
@@ -1,2 +1,3 @@
 !ty = !adt.type<basic<i64> representedAs i 64>
+!prodty = !adt.type<product<basic<i32>, basic<i32>> representedAs Word 1>
 %1 = "adt.dummy"() : () -> !ty
diff --git a/test/Adt/Zarith.mlir b/test/Adt/Zarith.mlir
index 423bcccf8c7a5df71bea89db98387b3118d30ae6..0b153cc9b8d86d18a05382d0fe57dd139c416364 100644
--- a/test/Adt/Zarith.mlir
+++ b/test/Adt/Zarith.mlir
@@ -1,2 +1,2 @@
 !integer = !adt.type<basic<i64> representedAs i 64>
-!sumtype = !adt.type<sum<Big:!integer,Small:!integer> representedAs Word 128>
+!sumtype = !adt.type<sum<Big:basic<i64>,Small:basic<i64>> representedAs Word 128>