template <typename TYPE>
TYPE parseIntSingleton(mlir::DialectAsmParser &parser) {
int kind = 0;
- if (parser.parseLess() || parser.parseInteger(kind) ||
- parser.parseGreater()) {
- parser.emitError(parser.getCurrentLocation(), "kind value expected");
+ if (parser.parseLess() || parser.parseInteger(kind) || parser.parseGreater())
return {};
- }
return TYPE::get(parser.getBuilder().getContext(), kind);
}
template <typename TYPE>
TYPE parseTypeSingleton(mlir::DialectAsmParser &parser) {
mlir::Type ty;
- if (parser.parseLess() || parser.parseType(ty) || parser.parseGreater()) {
- parser.emitError(parser.getCurrentLocation(), "type expected");
+ if (parser.parseLess() || parser.parseType(ty) || parser.parseGreater())
return {};
- }
return TYPE::get(ty);
}
bool verifyRecordMemberType(mlir::Type ty) {
return !(ty.isa<BoxType>() || ty.isa<BoxCharType>() ||
ty.isa<BoxProcType>() || ty.isa<ShapeType>() ||
- ty.isa<ShapeShiftType>() || ty.isa<SliceType>() ||
- ty.isa<FieldType>() || ty.isa<LenType>() ||
+ ty.isa<ShapeShiftType>() || ty.isa<ShiftType>() ||
+ ty.isa<SliceType>() || ty.isa<FieldType>() || ty.isa<LenType>() ||
ty.isa<ReferenceType>() || ty.isa<TypeDescType>());
}
mlir::DialectAsmParser &parser) {
llvm::StringRef typeNameLit;
if (mlir::failed(parser.parseKeyword(&typeNameLit)))
- return mlir::Type();
-
+ return {};
return generatedTypeParser(dialect->getContext(), parser, typeNameLit);
}
mlir::Type BoxProcType::parse(mlir::MLIRContext *context,
mlir::DialectAsmParser &parser) {
mlir::Type ty;
- if (parser.parseLess() || parser.parseType(ty) || parser.parseGreater()) {
- parser.emitError(parser.getCurrentLocation(), "type expected");
+ if (parser.parseLess() || parser.parseType(ty) || parser.parseGreater())
return {};
- }
return get(context, ty);
}
mlir::Type fir::BoxType::parse(mlir::MLIRContext *context,
mlir::DialectAsmParser &parser) {
mlir::Type ofTy;
- if (parser.parseLess() || parser.parseType(ofTy)) {
- parser.emitError(parser.getCurrentLocation(), "expected type parameter");
+ if (parser.parseLess() || parser.parseType(ofTy))
return {};
- }
mlir::AffineMapAttr map;
if (!parser.parseOptionalComma()) {
return {};
}
}
- if (parser.parseGreater()) {
+ if (parser.parseGreater())
return {};
- }
return get(ofTy, map);
}
mlir::Type fir::BoxCharType::parse(mlir::MLIRContext *context,
mlir::DialectAsmParser &parser) {
- int kind = 0;
- if (parser.parseLess() || parser.parseInteger(kind) ||
- parser.parseGreater()) {
- parser.emitError(parser.getCurrentLocation(), "kind value expected");
- return {};
- }
- return get(context, kind);
+ return parseKindSingleton<fir::BoxCharType>(parser);
}
void fir::BoxCharType::print(mlir::DialectAsmPrinter &printer) const {
mlir::Type fir::CharacterType::parse(mlir::MLIRContext *context,
mlir::DialectAsmParser &parser) {
int kind = 0;
- if (parser.parseLess() || parser.parseInteger(kind)) {
- parser.emitError(parser.getCurrentLocation(), "kind value expected");
+ if (parser.parseLess() || parser.parseInteger(kind))
return {};
- }
CharacterType::LenType len = 1;
if (mlir::succeeded(parser.parseOptionalComma())) {
if (mlir::succeeded(parser.parseOptionalQuestion())) {
len = fir::CharacterType::unknownLen();
} else if (!mlir::succeeded(parser.parseInteger(len))) {
- parser.emitError(parser.getCurrentLocation(), "len value expected");
return {};
}
}
mlir::Type fir::RecordType::parse(mlir::MLIRContext *context,
mlir::DialectAsmParser &parser) {
llvm::StringRef name;
- if (parser.parseLess() || parser.parseKeyword(&name)) {
- parser.emitError(parser.getNameLoc(),
- "expected a identifier as name of derived type");
+ if (parser.parseLess() || parser.parseKeyword(&name))
return {};
- }
RecordType result = RecordType::get(parser.getBuilder().getContext(), name);
RecordType::TypeList lenParamList;
if (parser.parseOptionalComma())
break;
}
- if (parser.parseRParen()) {
- parser.emitError(parser.getNameLoc(), "expected ')'");
+ if (parser.parseRParen())
return {};
- }
}
RecordType::TypeList typeList;
if (parser.parseOptionalComma())
break;
}
- if (parser.parseRBrace()) {
- parser.emitError(parser.getNameLoc(), "expected '}'");
+ if (parser.parseRBrace())
return {};
- }
}
- if (parser.parseGreater()) {
- parser.emitError(parser.getNameLoc(), "expected '>' in type type");
+ if (parser.parseGreater())
return {};
- }
if (lenParamList.empty() && typeList.empty())
return result;
// bounds ::= `?` | int-lit
mlir::Type fir::SequenceType::parse(mlir::MLIRContext *context,
mlir::DialectAsmParser &parser) {
- if (parser.parseLess()) {
- parser.emitError(parser.getNameLoc(), "expecting '<'");
+ if (parser.parseLess())
return {};
- }
SequenceType::Shape shape;
if (parser.parseOptionalStar()) {
- if (parser.parseDimensionList(shape, /*allowDynamic=*/true)) {
- parser.emitError(parser.getNameLoc(), "invalid shape");
+ if (parser.parseDimensionList(shape, /*allowDynamic=*/true))
return {};
- }
} else if (parser.parseColon()) {
- parser.emitError(parser.getNameLoc(), "expected ':'");
return {};
}
mlir::Type eleTy;
- if (parser.parseType(eleTy) || parser.parseGreater()) {
- parser.emitError(parser.getNameLoc(), "expecting element type");
+ if (parser.parseType(eleTy) || parser.parseGreater())
return {};
- }
mlir::AffineMapAttr map;
if (!parser.parseOptionalComma())
if (parser.parseAttribute(map)) {
int64_t len = 0;
mlir::Type eleTy;
if (parser.parseLess() || parser.parseInteger(len) || parser.parseColon() ||
- parser.parseType(eleTy) || parser.parseGreater()) {
- parser.emitError(parser.getNameLoc(), "invalid vector type");
+ parser.parseType(eleTy) || parser.parseGreater())
return {};
- }
return fir::VectorType::get(len, eleTy);
}
--- /dev/null
+// Test the FIR types parser diagnostics
+// RUN: fir-opt -split-input-file -verify-diagnostics %s
+
+// expected-error@+1 {{expected non-function type}}
+func private @box3() -> !fir.boxproc<>
+
+// -----
+
+// expected-error@+2 {{expected non-function type}}
+// expected-error@+1 {{expected affine map}}
+func private @box1() -> !fir.box<!fir.array<?xf32>, >
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @box1() -> !fir.box<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @box2() -> !fir.boxchar<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @it6() -> !fir.char<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @it6() -> !fir.char<2, >
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @it3() -> !fir.complex<>
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @mem3() -> !fir.heap<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @it1() -> !fir.int<A>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @it1() -> !fir.logical<b>
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @mem3() -> !fir.ptr<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @mem3() -> !fir.real<>
+
+// -----
+
+// expected-error@+1 {{expected valid keyword}}
+func private @mem3() -> !fir.type<>
+
+// -----
+
+// expected-error@+2 {{expected valid keyword}}
+// expected-error@+1 {{expected LEN parameter list}}
+func private @dvd4() -> !fir.type<derived4()>
+
+// -----
+
+// expected-error@+2 {{expected ':'}}
+// expected-error@+1 {{expected LEN parameter list}}
+func private @dvd4() -> !fir.type<derived4(p)>
+
+// -----
+
+// expected-error@+2 {{expected non-function type}}
+// expected-error@+1 {{expected LEN parameter list}}
+func private @dvd4() -> !fir.type<derived4(p:)>
+
+// -----
+
+// expected-error@+2 {{expected valid keyword}}
+// expected-error@+1 {{expected field type list}}
+func private @dvd4() -> !fir.type<derived4(p:i8){}>
+
+// -----
+
+// expected-error@+2 {{expected ':'}}
+// expected-error@+1 {{expected field type list}}
+func private @dvd4() -> !fir.type<derived4(p:i8){f1}>
+
+// -----
+
+// expected-error@+2 {{expected non-function type}}
+// expected-error@+1 {{expected field type list}}
+func private @dvd4() -> !fir.type<derived4(p:i8){f1:f2}>
+
+// -----
+
+// expected-error@+2 {{expected valid keyword}}
+// expected-error@+1 {{expected field type list}}
+func private @dvd4() -> !fir.type<derived4(p:i8){f1:i32,}>
+
+// -----
+
+// expected-error@+2 {{expected valid keyword}}
+// expected-error@+1 {{expected field type list}}
+func private @dvd4() -> !fir.type<derived4(p:i8){,}>
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @mem3() -> !fir.ref<>
+
+// -----
+
+// expected-error@+1 {{expected ':'}}
+func private @arr1() -> !fir.array<*>
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @arr1() -> !fir.array<*:>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @oth1() -> !fir.shape<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @oth1() -> !fir.shapeshift<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @oth1() -> !fir.shift<>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @oth1() -> !fir.slice<>
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @oth3() -> !fir.tdesc<xx>
+
+// -----
+
+// expected-error@+1 {{expected integer value}}
+func private @oth3() -> !fir.vector<>
+
+// -----
+
+// expected-error@+1 {{expected ':'}}
+func private @oth3() -> !fir.vector<10>
+
+// -----
+
+// expected-error@+1 {{expected non-function type}}
+func private @oth3() -> !fir.vector<10:>