@@ -68,12 +68,12 @@ inline LogicalResult interleaveCommaWithError(const Container &c,
68
68
69
69
// / Return the precedence of a operator as an integer, higher values
70
70
// / imply higher precedence.
71
- static int getOperatorPrecedence (Operation *operation) {
72
- return llvm::TypeSwitch<Operation *, int >(operation)
71
+ static FailureOr< int > getOperatorPrecedence (Operation *operation) {
72
+ return llvm::TypeSwitch<Operation *, FailureOr< int > >(operation)
73
73
.Case <emitc::AddOp>([&](auto op) { return 11 ; })
74
74
.Case <emitc::ApplyOp>([&](auto op) { return 13 ; })
75
75
.Case <emitc::CastOp>([&](auto op) { return 13 ; })
76
- .Case <emitc::CmpOp>([&](auto op) {
76
+ .Case <emitc::CmpOp>([&](auto op) -> FailureOr< int > {
77
77
switch (op.getPredicate ()) {
78
78
case emitc::CmpPredicate::eq:
79
79
case emitc::CmpPredicate::ne:
@@ -86,13 +86,14 @@ static int getOperatorPrecedence(Operation *operation) {
86
86
case emitc::CmpPredicate::three_way:
87
87
return 10 ;
88
88
}
89
+ return op->emitError (" unsupported cmp predicate" );
89
90
})
90
91
.Case <emitc::DivOp>([&](auto op) { return 12 ; })
91
92
.Case <emitc::MulOp>([&](auto op) { return 12 ; })
92
93
.Case <emitc::RemOp>([&](auto op) { return 12 ; })
93
94
.Case <emitc::SubOp>([&](auto op) { return 11 ; })
94
- .Case <emitc::CallOpaqueOp>([&](auto op) { return 14 ; });
95
- llvm_unreachable ( " Unsupported operator " );
95
+ .Case <emitc::CallOpaqueOp>([&](auto op) { return 14 ; })
96
+ . Default ([]( auto op) { return op-> emitError ( " unsupported operationu " ); } );
96
97
}
97
98
98
99
namespace {
@@ -1072,7 +1073,10 @@ LogicalResult CppEmitter::emitExpression(ExpressionOp expressionOp) {
1072
1073
Operation *rootOp = expressionOp.getRootOp ();
1073
1074
1074
1075
emittedExpression = expressionOp;
1075
- pushExpressionPrecedence (getOperatorPrecedence (rootOp));
1076
+ FailureOr<int > precedence = getOperatorPrecedence (rootOp);
1077
+ if (failed (precedence))
1078
+ return failure ();
1079
+ pushExpressionPrecedence (precedence.value ());
1076
1080
1077
1081
if (failed (emitOperation (*rootOp, /* trailingSemicolon=*/ false )))
1078
1082
return failure ();
@@ -1089,13 +1093,15 @@ LogicalResult CppEmitter::emitOperand(Value value) {
1089
1093
if (isPartOfCurrentExpression (value)) {
1090
1094
Operation *def = value.getDefiningOp ();
1091
1095
assert (def && " Expected operand to be defined by an operation" );
1092
- int precedence = getOperatorPrecedence (def);
1093
- bool encloseInParenthesis = precedence < getExpressionPrecedence ();
1096
+ FailureOr<int > precedence = getOperatorPrecedence (def);
1097
+ if (failed (precedence))
1098
+ return failure ();
1099
+ bool encloseInParenthesis = precedence.value () < getExpressionPrecedence ();
1094
1100
if (encloseInParenthesis) {
1095
1101
os << " (" ;
1096
1102
pushExpressionPrecedence (lowestPrecedence ());
1097
1103
} else
1098
- pushExpressionPrecedence (precedence);
1104
+ pushExpressionPrecedence (precedence. value () );
1099
1105
1100
1106
if (failed (emitOperation (*def, /* trailingSemicolon=*/ false )))
1101
1107
return failure ();
0 commit comments