pcbnew: fix incorrect type cast in DRC_TEST_PROVIDER_TEXT_DIMS

FP_TEXT cannot be casted to PCB_TEXT for obvious reasons, but what I don't understand is why downcasting to EDA_TEXT also crashes due to incorrect vtable method pointer (Clang10/Linux here).

I leave this as a curiosity for whoever knows C++.
This commit is contained in:
Tomasz Wlostowski 2022-01-01 22:35:29 +01:00
parent 93018375f8
commit dafa8ec671
1 changed files with 29 additions and 12 deletions

View File

@ -103,10 +103,29 @@ bool DRC_TEST_PROVIDER_TEXT_DIMS::Run()
if( !reportProgress( ii++, count, delta ) )
return false;
PCB_TEXT* textItem = static_cast<PCB_TEXT*>( item );
wxASSERT( item->Type() == PCB_TEXT_T || item->Type() == PCB_FP_TEXT_T );
int actualH = 0, actualT = 0;
bool visible;
if( item->Type() == PCB_TEXT_T )
{
PCB_TEXT* textItem = static_cast<PCB_TEXT*>( item );
visible = textItem->IsVisible();
actualH = textItem->GetTextHeight();
actualT = textItem->GetTextThickness();
}
else if ( item->Type() == PCB_FP_TEXT_T )
{
FP_TEXT* fpTextItem = static_cast<FP_TEXT*>( item );
visible = fpTextItem->IsVisible();
actualH = fpTextItem->GetTextHeight();
actualT = fpTextItem->GetTextThickness();
}
DRC_CONSTRAINT constraint;
if( !textItem->IsVisible() )
if( !visible )
return true;
if( !m_drcEngine->IsErrorLimitExceeded( DRCE_TEXT_HEIGHT ) )
@ -116,17 +135,16 @@ bool DRC_TEST_PROVIDER_TEXT_DIMS::Run()
bool fail_min = false;
bool fail_max = false;
int constraintHeight;
int actual = textItem->GetTextHeight();
if( constraint.GetSeverity() != RPT_SEVERITY_IGNORE )
{
if( constraint.Value().HasMin() && actual < constraint.Value().Min() )
if( constraint.Value().HasMin() && actualH < constraint.Value().Min() )
{
fail_min = true;
constraintHeight = constraint.Value().Min();
}
if( constraint.Value().HasMax() && actual > constraint.Value().Max() )
if( constraint.Value().HasMax() && actualH > constraint.Value().Max() )
{
fail_max = true;
constraintHeight = constraint.Value().Max();
@ -142,14 +160,14 @@ bool DRC_TEST_PROVIDER_TEXT_DIMS::Run()
m_msg.Printf( _( "(%s min height %s; actual %s)" ),
constraint.GetName(),
MessageTextFromValue( userUnits(), constraintHeight ),
MessageTextFromValue( userUnits(), actual ) );
MessageTextFromValue( userUnits(), actualH ) );
}
else
{
m_msg.Printf( _( "(%s max height %s; actual %s)" ),
constraint.GetName(),
MessageTextFromValue( userUnits(), constraintHeight ),
MessageTextFromValue( userUnits(), actual ) );
MessageTextFromValue( userUnits(), actualH ) );
}
drcItem->SetErrorMessage( drcItem->GetErrorText() + wxS( " " ) + m_msg );
@ -167,17 +185,16 @@ bool DRC_TEST_PROVIDER_TEXT_DIMS::Run()
bool fail_min = false;
bool fail_max = false;
int constraintThickness;
int actual = textItem->GetTextThickness();
if( constraint.GetSeverity() != RPT_SEVERITY_IGNORE )
{
if( constraint.Value().HasMin() && actual < constraint.Value().Min() )
if( constraint.Value().HasMin() && actualT < constraint.Value().Min() )
{
fail_min = true;
constraintThickness = constraint.Value().Min();
}
if( constraint.Value().HasMax() && actual > constraint.Value().Max() )
if( constraint.Value().HasMax() && actualT > constraint.Value().Max() )
{
fail_max = true;
constraintThickness = constraint.Value().Max();
@ -193,14 +210,14 @@ bool DRC_TEST_PROVIDER_TEXT_DIMS::Run()
m_msg.Printf( _( "(%s min thickness %s; actual %s)" ),
constraint.GetName(),
MessageTextFromValue( userUnits(), constraintThickness ),
MessageTextFromValue( userUnits(), actual ) );
MessageTextFromValue( userUnits(), actualT ) );
}
else
{
m_msg.Printf( _( "(%s max thickness %s; actual %s)" ),
constraint.GetName(),
MessageTextFromValue( userUnits(), constraintThickness ),
MessageTextFromValue( userUnits(), actual ) );
MessageTextFromValue( userUnits(), actualT ) );
}
drcItem->SetErrorMessage( drcItem->GetErrorText() + wxS( " " ) + m_msg );