@@ -69,12 +69,12 @@ inline LogicalResult interleaveCommaWithError(const Container &c,
69
69
70
70
// / Return the precedence of a operator as an integer, higher values
71
71
// / imply higher precedence.
72
- static int getOperatorPrecedence (Operation *operation) {
73
- return llvm::TypeSwitch<Operation *, int >(operation)
72
+ static FailureOr< int > getOperatorPrecedence (Operation *operation) {
73
+ return llvm::TypeSwitch<Operation *, FailureOr< int > >(operation)
74
74
.Case <emitc::AddOp>([&](auto op) { return 11 ; })
75
75
.Case <emitc::ApplyOp>([&](auto op) { return 13 ; })
76
76
.Case <emitc::CastOp>([&](auto op) { return 13 ; })
77
- .Case <emitc::CmpOp>([&](auto op) {
77
+ .Case <emitc::CmpOp>([&](auto op) -> FailureOr< int > {
78
78
switch (op.getPredicate ()) {
79
79
case emitc::CmpPredicate::eq:
80
80
case emitc::CmpPredicate::ne:
@@ -87,13 +87,14 @@ static int getOperatorPrecedence(Operation *operation) {
87
87
case emitc::CmpPredicate::three_way:
88
88
return 10 ;
89
89
}
90
+ return op->emitError (" unsupported cmp predicate" );
90
91
})
91
92
.Case <emitc::DivOp>([&](auto op) { return 12 ; })
92
93
.Case <emitc::MulOp>([&](auto op) { return 12 ; })
93
94
.Case <emitc::RemOp>([&](auto op) { return 12 ; })
94
95
.Case <emitc::SubOp>([&](auto op) { return 11 ; })
95
- .Case <emitc::CallOpaqueOp>([&](auto op) { return 14 ; });
96
- llvm_unreachable ( " Unsupported operator " );
96
+ .Case <emitc::CallOpaqueOp>([&](auto op) { return 14 ; })
97
+ . Default ([]( auto op) { return op-> emitError ( " unsupported operation " ); } );
97
98
}
98
99
99
100
namespace {
@@ -1151,7 +1152,10 @@ LogicalResult CppEmitter::emitExpression(ExpressionOp expressionOp) {
1151
1152
Operation *rootOp = expressionOp.getRootOp ();
1152
1153
1153
1154
emittedExpression = expressionOp;
1154
- pushExpressionPrecedence (getOperatorPrecedence (rootOp));
1155
+ FailureOr<int > precedence = getOperatorPrecedence (rootOp);
1156
+ if (failed (precedence))
1157
+ return failure ();
1158
+ pushExpressionPrecedence (precedence.value ());
1155
1159
1156
1160
if (failed (emitOperation (*rootOp, /* trailingSemicolon=*/ false )))
1157
1161
return failure ();
@@ -1168,13 +1172,15 @@ LogicalResult CppEmitter::emitOperand(Value value) {
1168
1172
if (isPartOfCurrentExpression (value)) {
1169
1173
Operation *def = value.getDefiningOp ();
1170
1174
assert (def && " Expected operand to be defined by an operation" );
1171
- int precedence = getOperatorPrecedence (def);
1172
- bool encloseInParenthesis = precedence < getExpressionPrecedence ();
1175
+ FailureOr<int > precedence = getOperatorPrecedence (def);
1176
+ if (failed (precedence))
1177
+ return failure ();
1178
+ bool encloseInParenthesis = precedence.value () < getExpressionPrecedence ();
1173
1179
if (encloseInParenthesis) {
1174
1180
os << " (" ;
1175
1181
pushExpressionPrecedence (lowestPrecedence ());
1176
1182
} else
1177
- pushExpressionPrecedence (precedence);
1183
+ pushExpressionPrecedence (precedence. value () );
1178
1184
1179
1185
if (failed (emitOperation (*def, /* trailingSemicolon=*/ false )))
1180
1186
return failure ();
0 commit comments