@@ -122,6 +122,18 @@ struct ASTInterpreter::NewPlacementResult {};
122122
123123struct  ASTInterpreter ::NestedNamespaceSpecifierResult {};
124124
125+ struct  ASTInterpreter ::ToBool {
126+   ASTInterpreter& interp;
127+ 
128+   auto  operator ()(const  StringLiteral*) const  -> std::optional<bool> {
129+     return  true ;
130+   }
131+ 
132+   auto  operator ()(const  auto & value) const  -> std::optional<bool> {
133+     return  bool (value);
134+   }
135+ };
136+ 
125137struct  ASTInterpreter ::UnitVisitor {
126138  ASTInterpreter& accept;
127139
@@ -2193,10 +2205,17 @@ auto ASTInterpreter::ExpressionVisitor::operator()(BinaryExpressionAST* ast)
21932205auto  ASTInterpreter::ExpressionVisitor::operator ()(
21942206    ConditionalExpressionAST* ast) -> ExpressionResult {
21952207  auto  conditionResult = accept (ast->condition );
2196-   auto  iftrueExpressionResult = accept (ast->iftrueExpression );
2197-   auto  iffalseExpressionResult = accept (ast->iffalseExpression );
21982208
2199-   return  ExpressionResult{std::nullopt };
2209+   if  (!conditionResult.has_value ()) return  std::nullopt ;
2210+ 
2211+   if  (accept.toBool (conditionResult.value ())) {
2212+     auto  result = accept (ast->iftrueExpression );
2213+     return  result;
2214+   }
2215+ 
2216+   auto  result = accept (ast->iffalseExpression );
2217+ 
2218+   return  result;
22002219}
22012220
22022221auto  ASTInterpreter::ExpressionVisitor::operator ()(YieldExpressionAST* ast)
@@ -3176,4 +3195,8 @@ auto ASTInterpreter::evaluate(ExpressionAST* ast) -> std::optional<ConstValue> {
31763195  return  result;
31773196}
31783197
3198+ auto  ASTInterpreter::toBool (const  ConstValue& value) -> std::optional<bool> {
3199+   return  std::visit (ToBool{*this }, value);
3200+ }
3201+ 
31793202}  //  namespace cxx
0 commit comments