@@ -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 {
@@ -1120,7 +1121,10 @@ LogicalResult CppEmitter::emitExpression(ExpressionOp expressionOp) {
1120
1121
Operation *rootOp = expressionOp.getRootOp ();
1121
1122
1122
1123
emittedExpression = expressionOp;
1123
- pushExpressionPrecedence (getOperatorPrecedence (rootOp));
1124
+ FailureOr<int > precedence = getOperatorPrecedence (rootOp);
1125
+ if (failed (precedence))
1126
+ return failure ();
1127
+ pushExpressionPrecedence (precedence.value ());
1124
1128
1125
1129
if (failed (emitOperation (*rootOp, /* trailingSemicolon=*/ false )))
1126
1130
return failure ();
@@ -1137,13 +1141,15 @@ LogicalResult CppEmitter::emitOperand(Value value) {
1137
1141
if (isPartOfCurrentExpression (value)) {
1138
1142
Operation *def = value.getDefiningOp ();
1139
1143
assert (def && " Expected operand to be defined by an operation" );
1140
- int precedence = getOperatorPrecedence (def);
1141
- bool encloseInParenthesis = precedence < getExpressionPrecedence ();
1144
+ FailureOr<int > precedence = getOperatorPrecedence (def);
1145
+ if (failed (precedence))
1146
+ return failure ();
1147
+ bool encloseInParenthesis = precedence.value () < getExpressionPrecedence ();
1142
1148
if (encloseInParenthesis) {
1143
1149
os << " (" ;
1144
1150
pushExpressionPrecedence (lowestPrecedence ());
1145
1151
} else
1146
- pushExpressionPrecedence (precedence);
1152
+ pushExpressionPrecedence (precedence. value () );
1147
1153
1148
1154
if (failed (emitOperation (*def, /* trailingSemicolon=*/ false )))
1149
1155
return failure ();
0 commit comments