Skip to content

Commit 03546f2

Browse files
committed
Fix issue with implicit conversion (value_proxy to rational) uncovered by GCC 8
1 parent 8ba85fd commit 03546f2

File tree

4 files changed

+20
-15
lines changed

4 files changed

+20
-15
lines changed

include/bmc/braille/semantic_analysis/value_disambiguation.hpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class value_proxy
130130

131131
value_proxy(ast::simile &simile, rational const& simile_duration)
132132
: type{ptr_type::simile}, simile_ptr{&simile}
133-
, duration{simile_duration * simile.count}
133+
, duration{simile_duration * int(simile.count)}
134134
{ BOOST_ASSERT(simile_ptr->duration == zero); }
135135

136136
void make_beam_begin()
@@ -174,7 +174,10 @@ duration(std::vector<value_proxy> const &values)
174174
return values.empty()
175175
? zero
176176
: std::accumulate(std::next(std::begin(values)), std::end(values),
177-
static_cast<rational>(values.front()));
177+
static_cast<rational>(values.front()),
178+
[](rational const &a, value_proxy const &b) {
179+
return a + rational(b);
180+
});
178181
}
179182

180183
struct global_state

lib/lilypond.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ generator::operator() (braille::ast::moving_note const &chord)
414414
(*this)(chord.base);
415415
os << "}\\\\{";
416416
// @todo Account for dotted intervals.
417-
rational const moving_type(chord.base.as_rational() / chord.intervals.size());
417+
rational const moving_type(chord.base.as_rational() / int(chord.intervals.size()));
418418
for (braille::ast::interval const& interval: chord.intervals) {
419419
os << " ";
420420
ly_pitch_step(interval.step);

lib/musicxml.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -437,11 +437,11 @@ class make_measures_for_staff_visitor : public boost::static_visitor<void> {
437437
for (auto &&interval: moving_note.intervals) {
438438
::musicxml::note xml_note {
439439
pitch(interval),
440-
duration(moving_note.base.as_rational() / moving_note.intervals.size(),
440+
duration(moving_note.base.as_rational() / int(moving_note.intervals.size()),
441441
divisions)
442442
};
443443

444-
xml_note.type(note_type(moving_note.base.get_type() / moving_note.intervals.size()));
444+
xml_note.type(note_type(moving_note.base.get_type() / int(moving_note.intervals.size())));
445445
xml_note.dot(dots(moving_note.base));
446446
if (interval.acc) xml_note.accidental(accidental(*interval.acc));
447447
xml_note.staff(staff_number);

lib/value_disambiguation.cpp

+12-10
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,10 @@ class notegroup: public boost::static_visitor<void>
266266
{
267267
BOOST_ASSERT(stack_begin != stack_end);
268268
return std::accumulate(std::next(stack_begin), stack_end,
269-
static_cast<rational>(*stack_begin));
269+
static_cast<rational>(*stack_begin),
270+
[](rational const &a, value_proxy const &b) {
271+
return a + rational(b);
272+
});
270273
}
271274

272275
tuplet_info const &tuplet_state() const { return tuplet; }
@@ -505,7 +508,7 @@ class partial_voice_interpreter
505508
state.time_signature != 1 && maybe_whole_measure_rest(*iterator)) {
506509
*stack_end = value_proxy(boost::get<ast::rest>(*iterator), state.time_signature);
507510
recurse( std::next(iterator), end, stack_begin, std::next(stack_end)
508-
, zero, position + state.time_signature, tuplet);
511+
, zero, position + rational(state.time_signature), tuplet);
509512
}
510513
}
511514
}
@@ -589,7 +592,7 @@ class large_and_small_visitor : public boost::static_visitor<bool>
589592
if (!is_grace(value)) {
590593
value_proxy *const next = proxy + 1;
591594
if (fast_leq(*new(proxy)value_proxy(value, large_value, factor), max_duration)) {
592-
rational const next_position(position + *proxy);
595+
rational const next_position(position + rational(*proxy));
593596
// If this is a tuplet end, only accept it if its position makes sense.
594597
if (!dyadic_next_position || is_dyadic(next_position)) {
595598
if (std::distance(rest, end) >= 10 && state.threads < max_threads) {
@@ -604,25 +607,25 @@ class large_and_small_visitor : public boost::static_visitor<bool>
604607
new_proxy->set_tuplet_info(tuplet_begin, tuplet_end);
605608
future = std::async(std::launch::async, [&]() {
606609
interpreter.recurse( rest, end, new_stack.get(), new_proxy + 1
607-
, max_duration - *new_proxy, next_position
610+
, max_duration - rational(*new_proxy), next_position
608611
, tuplet
609612
);
610613
state.threads--;
611614
});
612615
} else {
613616
proxy->set_tuplet_info(tuplet_begin, tuplet_end);
614617
interpreter.recurse( rest, end, stack_begin, next
615-
, max_duration - *proxy, next_position, tuplet
618+
, max_duration - rational(*proxy), next_position, tuplet
616619
);
617620
}
618621
}
619622
}
620623
if (fast_leq(*new(proxy)value_proxy(value, small_value, factor), max_duration)) {
621-
rational const next_position(position + *proxy);
624+
rational const next_position(position + rational(*proxy));
622625
if (!dyadic_next_position || is_dyadic(next_position)) {
623626
proxy->set_tuplet_info(tuplet_begin, tuplet_end);
624627
interpreter.recurse( rest, end, stack_begin, next
625-
, max_duration - *proxy, next_position, tuplet
628+
, max_duration - rational(*proxy), next_position, tuplet
626629
);
627630
}
628631
}
@@ -635,8 +638,7 @@ class large_and_small_visitor : public boost::static_visitor<bool>
635638
{
636639
if (!position) { // full measure simile
637640
BOOST_ASSERT(static_cast<bool>(interpreter.last_measure_duration()));
638-
if (*new(proxy)value_proxy
639-
(simile, interpreter.last_measure_duration()) > rational(0) &&
641+
if (rational(*new(proxy)value_proxy(simile, interpreter.last_measure_duration())) > rational(0) &&
640642
fast_leq(static_cast<rational>(*proxy) / rational::int_type(simile.count), max_duration)) {
641643
rational const duration(static_cast<rational>(*proxy) / rational::int_type(simile.count));
642644
interpreter.recurse( rest, end, stack_begin, proxy + 1
@@ -666,7 +668,7 @@ class large_and_small_visitor : public boost::static_visitor<bool>
666668
tuplet.back().ttl = count_rhythmic(rest, tuplet_end(rest, end, tuplet.back().number, true));
667669
}
668670
interpreter.recurse( rest, end, stack_begin, proxy + 1
669-
, max_duration - *proxy, position + *proxy
671+
, max_duration - rational(*proxy), position + rational(*proxy)
670672
, tuplet
671673
);
672674
}

0 commit comments

Comments
 (0)