From 82cdc92622a5170393caeed92a8e91db909a9e84 Mon Sep 17 00:00:00 2001 From: Hans Loeblich Date: Mon, 5 Dec 2022 14:08:16 -0600 Subject: [PATCH 1/2] Fix for issue #4432, added type warnings, plus more natural argument naming in warnings. --- src/core/LinearExtrudeNode.cc | 5 +- src/core/Parameters.cc | 49 ++++++++++++++++-- src/core/Parameters.h | 28 +++++++++- src/core/builtin_functions.cc | 16 +++--- tests/CMakeLists.txt | 1 + tests/data/scad/3D/issues/issue4432.scad | 1 + .../cgalpngtest/issue4432-expected.png | Bin 0 -> 9743 bytes ...near_extrude-parameter-tests-expected.echo | 18 +++++++ .../echotest/text-metrics-test-expected.echo | 22 ++++---- .../opencsgtest/issue4432-expected.png | Bin 0 -> 9743 bytes .../throwntogethertest/issue4432-expected.png | Bin 0 -> 9736 bytes 11 files changed, 114 insertions(+), 26 deletions(-) create mode 100644 tests/data/scad/3D/issues/issue4432.scad create mode 100644 tests/regression/cgalpngtest/issue4432-expected.png create mode 100644 tests/regression/echotest/linear_extrude-parameter-tests-expected.echo create mode 100644 tests/regression/opencsgtest/issue4432-expected.png create mode 100644 tests/regression/throwntogethertest/issue4432-expected.png diff --git a/src/core/LinearExtrudeNode.cc b/src/core/LinearExtrudeNode.cc index 004c546d11..36d72539c1 100644 --- a/src/core/LinearExtrudeNode.cc +++ b/src/core/LinearExtrudeNode.cc @@ -75,6 +75,7 @@ static std::shared_ptr builtin_linear_extrude(const ModuleInstanti auto node = std::make_shared(inst); Parameters parameters = parse_parameters(std::move(arguments), inst->location()); + parameters.set_caller("linear_extrude"); node->fn = parameters["$fn"].toDouble(); node->fs = parameters["$fs"].toDouble(); @@ -115,8 +116,8 @@ static std::shared_ptr builtin_linear_extrude(const ModuleInstanti if (node->scale_x < 0) node->scale_x = 0; if (node->scale_y < 0) node->scale_y = 0; - node->has_slices = parameters["slices"].getUnsignedInt(node->slices); - node->has_segments = parameters["segments"].getUnsignedInt(node->segments); + node->has_slices = parameters.validate_integral("slices", node->slices, 1u); + node->has_segments = parameters.validate_integral("segments", node->segments, 0u); node->twist = 0.0; parameters["twist"].getFiniteDouble(node->twist); diff --git a/src/core/Parameters.cc b/src/core/Parameters.cc index eeb962f7e1..851043df2d 100644 --- a/src/core/Parameters.cc +++ b/src/core/Parameters.cc @@ -102,6 +102,23 @@ bool Parameters::valid(const std::string& name, Value::Type type) return valid(name, *value, type); } +// Handle all general warnings and return true if a valid number is found. +bool Parameters::validate_number(const std::string& name, double& out) +{ + boost::optional value = lookup(name); + if (!value || value->isUndefined()) { + return false; + } else if (valid(name, *value, Value::Type::NUMBER)) { + if (value->getFiniteDouble(out)) { + return true; + } else { + LOG(message_group::Warning, loc, documentRoot(), "%1$s(..., %2$s=%3$s) argument cannot be infinite or nan", caller, name, value->toString()); + return false; + } + } + return false; +} + ContextFrame Parameters::to_context_frame() && { handle.release(); @@ -234,12 +251,12 @@ void print_argCnt_warning( const std::string& expected, const Location& loc, const std::string& documentRoot - ){ + ) { LOG(message_group::Warning, loc, documentRoot, "%1$s() number of parameters does not match: expected %2$s, found %3$i", name, expected, found); } -void print_argConvert_warning( - const std::string& name, +void print_argConvert_positioned_warning( + const std::string& calledName, const std::string& where, const Value& found, std::vector expected, @@ -247,7 +264,7 @@ void print_argConvert_warning( const std::string& documentRoot ){ std::stringstream message; - message << name << "() parameter could not be converted: " << where << ": expected "; + message << calledName << "() parameter could not be converted: " << where << ": expected "; if (expected.size() == 1) { message << Value::typeName(expected[0]); } else { @@ -261,3 +278,27 @@ void print_argConvert_warning( message << ", found " << Value::typeName(found.type()) << " " << "(" << found.toEchoStringNoThrow() << ")"; LOG(message_group::Warning, loc, documentRoot, "%1$s", message.str()); } + +void print_argConvert_warning( + const std::string& calledName, + const std::string& argName, + const Value& found, + std::vector expected, + const Location& loc, + const std::string& documentRoot + ) { + std::stringstream message; + message << calledName << "(..., " << argName << "=" << found.toEchoStringNoThrow() << ") parameter could not be converted: expected "; + if (expected.size() == 1) { + message << Value::typeName(expected[0]); + } else { + assert(expected.size() > 0); + message << "one of (" << Value::typeName(expected[0]); + for (size_t i = 1; i < expected.size(); i++) { + message << ", " << Value::typeName(expected[i]); + } + message << ")"; + } + message << ", found " << Value::typeName(found.type()); + LOG(message_group::Warning, loc, documentRoot, "%1$s", message.str()); +} diff --git a/src/core/Parameters.h b/src/core/Parameters.h index cb0e613c82..2a2c7865b6 100644 --- a/src/core/Parameters.h +++ b/src/core/Parameters.h @@ -56,6 +56,10 @@ class Parameters const Value& operator[](const std::string& name) const { return get(name); } bool valid(const std::string& name, Value::Type type); bool valid_required(const std::string& name, Value::Type type); + bool validate_number(const std::string& name, double& out); + template bool validate_integral(const std::string& name, T& out, + T lo = std::numeric_limits::min(), + T hi = std::numeric_limits::max()); ContextFrame to_context_frame() &&; @@ -70,9 +74,31 @@ class Parameters Location loc; }; +// Silently clamp to the given range(defaults to numeric_limits) +// as long as param is a finite number. +template +bool Parameters::validate_integral(const std::string& name, T& out, T lo, T hi) +{ + double temp; + if (validate_number(name, temp)) { + if (temp < lo) { + out = lo; + } else if (temp > hi) { + out = hi; + } else { + out = static_cast(temp); + } + return true; + } + return false; +} + void print_argCnt_warning(const std::string& name, int found, const std::string& expected, const Location& loc, const std::string& documentRoot); -void print_argConvert_warning(const std::string& name, const std::string& where, +void print_argConvert_positioned_warning(const std::string& calledName, const std::string& where, + const Value& found, std::vector expected, + const Location& loc, const std::string& documentRoot); +void print_argConvert_warning(const std::string& calledName, const std::string& argName, const Value& found, std::vector expected, const Location& loc, const std::string& documentRoot); diff --git a/src/core/builtin_functions.cc b/src/core/builtin_functions.cc index ba6a2d1c26..76c63419e0 100644 --- a/src/core/builtin_functions.cc +++ b/src/core/builtin_functions.cc @@ -73,11 +73,11 @@ static inline bool check_arguments(const char *function_name, const Arguments& a return true; } /* // Commented due to compiler warning of unused function. -static inline bool try_check_arguments(const Arguments& arguments, int expected_count) -{ - return check_arguments(nullptr, arguments, Location::NONE, expected_count, false); -} -*/ + static inline bool try_check_arguments(const Arguments& arguments, int expected_count) + { + return check_arguments(nullptr, arguments, Location::NONE, expected_count, false); + } + */ template static inline bool check_arguments(const char *function_name, const Arguments& arguments, const Location& loc, const Value::Type (& expected_types) [N], bool warn = true) { @@ -87,7 +87,7 @@ static inline bool check_arguments(const char *function_name, const Arguments& a for (size_t i = 0; i < N; i++) { if (arguments[i]->type() != expected_types[i]) { if (warn) { - print_argConvert_warning(function_name, "argument " + STR(i), arguments[i]->clone(), {expected_types[i]}, loc, arguments.documentRoot()); + print_argConvert_positioned_warning(function_name, "argument " + STR(i), arguments[i]->clone(), {expected_types[i]}, loc, arguments.documentRoot()); } return false; } @@ -195,7 +195,7 @@ static std::vector min_max_arguments(const Arguments& arguments, const L // 4/20/14 semantic change per discussion: // break on any non-number if (element.type() != Value::Type::NUMBER) { - print_argConvert_warning(function_name, "vector element " + STR(i), element, {Value::Type::NUMBER}, loc, arguments.documentRoot()); + print_argConvert_positioned_warning(function_name, "vector element " + STR(i), element, {Value::Type::NUMBER}, loc, arguments.documentRoot()); return {}; } output.push_back(element.toDouble()); @@ -206,7 +206,7 @@ static std::vector min_max_arguments(const Arguments& arguments, const L // 4/20/14 semantic change per discussion: // break on any non-number if (argument->type() != Value::Type::NUMBER) { - print_argConvert_warning(function_name, "argument " + STR(i), argument->clone(), {Value::Type::NUMBER}, loc, arguments.documentRoot()); + print_argConvert_positioned_warning(function_name, "argument " + STR(i), argument->clone(), {Value::Type::NUMBER}, loc, arguments.documentRoot()); return {}; } output.push_back(argument->toDouble()); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ffb63da28b..3d32b2e69c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -523,6 +523,7 @@ list(APPEND FAILING_FILES list(APPEND ECHO_FILES ${FUNCTION_FILES} ${MISC_FILES} ${REDEFINITION_FILES} ${TEST_SCAD_DIR}/3D/features/for-tests.scad ${TEST_SCAD_DIR}/3D/features/rotate-parameters.scad + ${TEST_SCAD_DIR}/3D/features/linear_extrude-parameter-tests.scad ${TEST_SCAD_DIR}/misc/expression-evaluation-tests.scad ${TEST_SCAD_DIR}/misc/echo-tests.scad ${TEST_SCAD_DIR}/misc/assert-fail1-test.scad diff --git a/tests/data/scad/3D/issues/issue4432.scad b/tests/data/scad/3D/issues/issue4432.scad new file mode 100644 index 0000000000..bb6417f053 --- /dev/null +++ b/tests/data/scad/3D/issues/issue4432.scad @@ -0,0 +1 @@ +linear_extrude(height=10, twist=45, slices=0) square(10,center=true); \ No newline at end of file diff --git a/tests/regression/cgalpngtest/issue4432-expected.png b/tests/regression/cgalpngtest/issue4432-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..247443d9ef0f548ffbb0b3701ae6d0104629361c GIT binary patch literal 9743 zcmdsdc_5U3^zP@K8Dq(AN|a@?jY`(+%b*gni%^!znkDE2o~xkM7;En^kOj3J!jn%JuD|B7E2p~b)VUgHqrtTo z3i$Z|(4+-;Lj*`p1At%P|K7vb@gX2%)^o6sJOT*_#t}nI7E1n z(X`nwMWChuEq-?MrBZ}ITJWFEdTm(`m_G%?n!Tr*w2&FPfNXZp)9NX7r3%Iys(k$+ zx|RNERzWC1=Z^b41(}MI7cAx;n}$zsrh{a28OrG(9nki4;X`u~6r>7f%&IAto*S$7Pe4AR@0XKPa4{3aDcQ9e+*6I=G zcu-C|6~e_yYDN*jlyWk9F&dQ1dN!ZuBvC`wc2iBXoTPZLs2D$rW3Yyy62v#U6Y|nL zSDBn2)h-ObQMuHN=ZDCmp1H~B+k(LVaiFpT-W-t}^I`fJLz^b3vz@PvNAvT8Y_SbR zJ!Az7LGW?lv3%(HpL`y2;1u_@clzye+tkXHn<&nW)*1F|v7kkA!#M%Xj|F!mH>6aN z63hhK$ALpnp`UC7xyOO>1yJw~%O2j;a&)A?iXeAGHyVygK9pB7FgP$N1e)@a&M2*!#-dd8KKs zQPUfX;=5P(KnM}C5CC)a*B8FBS=(}!Ya&2U4B9yfVBBj*3WP}8Qr5Rnz%LB#91GGs zD3|aooaGz{{bV$FObZsPCWGQ~NOUOTe;sSwN>E%kfq@y2FLHLvL%4a5Mh!iJp%l>( z28}~kX#=M>lsrUU1_#)tf6{>QKSb4zEsWB=XS8@FPExfa-V+6`C7`P=f|9z!<7XKh zVgNYPOE96qyS$f$F~_Bdve^AwUE4KYJ)&)FYdsct47D!AZ~zZC8Mk zg=^9R6N9yo6t4(WJo`5|HU~gbyh2cn)P2uYRPhBQD=Q$fGPGR+VGI)|m7oD(2+W#w zJ)5E3)d1s%mu9~b6j7j92bsc5z(lzx=76h?cr+q85?wCC$*c*CldO2W_Ares1F}$?Hgezvh4k_xh~&N{=0>3Ah^Im% zoA>K|W#he%P7?%pOHTbXaJzraXcZMx2u;#}BW^qN)7Bt@rZ|a3Iy8cwbLo10ena=nN|%9nP)H)O3%bP^Ht8V;!^3Px82lcC zDlH`0igS?@y4GnGy1)L%Dt&l@&%RZCwMI37b1^KJitM&Nn<3-Ak%*K{y2Y)cUQCyA z4|gCy6B&b5|8VT#q?hdlE-fpdT}0=t;EkvMrup!+c+Tl1wBHdHB=S!5iTsJQsXm2l z)-cZen6aBDe-zew$f*&S6`H4CHRoc*t6w!IP3$%i3E^GI@(99(Zb&Z@eg-Bfi1#-AY`F*OuVK;RA0M#4HfdjdCYCQ4t$?ZjB z9I$mbE9GOyGoEFZuFl0wQqS15#6!#{26eC5zr0@Z^<ROyHn~JHkk*F>M4gf#wh)&Qo z20FZDX6$1B$jm->LgdG;Ft_th!aanwvbo5|KDCJc;_I6;LDP{`WbM-@^`8;&J1bUt zDS}0D5{u84!!tu`dz+ND1{@gMpW?i6G!dDxdR&l6G-6T63;5k0YZ?8?vY--FkVvbo z3gIr@%6qjkW6<^3R<4iZt?4n{py!z72iITeWUIjh1n>>h&V63%kUmV`D65}j&c>62 zq$0~?Np^S?8xgd`mXJrN$o2_S#OrZ}&%kf%@%LO9f*!xlUX`2CGoVRzdz^ilWtJvR z6)M(%b4f0s;9S8f1^*apTkJtdEb+7-9qwZ>4nu&&SQ2CKH4Zw`0cWRbE#|2%G`};E ztE^Wo!)7xpOXS87RNTAHc03NcK)v~XFIGh$Q<^d9Wiit5G)xLhUpPWP<)hjy`vCi% zKD`}jZ>hVzS+PuuK{)UwSdPO$!R5;SqC0F?$kI;u(+rz$lGCP866+!0+ zY&@7q#Nxxk=eg@HvzU8)Us}EtCA=>>Tktob*CX*<(c#_6@ZG6CLlhaq+!BKVE(he61BGAFnkp*z}80{(XPoT%Ryr00$x+ zVegu3^7kNHXqPfVd|Z#@83+kfziSD_rApMbW>l-}&ezO|2DPdw zt2H`A=7HPd71`xomdlCX0?JG@^~-i9-$*P$yC^DV8j5j>eCYBFrkAt&)tkR@G!0oS za9bIOt_o4I@tg9OO~$#*(rBqc#X1yo{&Is!8>|hkGc_9O7V1Sd44z1v zXQ1JC?#k}Y|8CY&7t52ENR-A9m;@*e)cgAjp4XMdUrvptrToQwD)%DTR465zQl^rg zidmo1PKX7onnQ{&X<_3axW;{*CsV$I9;V>ih`e{)Aq5u(HR~0|_oChUlAvRF$ZxLW zQ`?*cWg!&z|1SB|VtQH7)+_47NjJ9$Tyt$(M;b3X*}kO;ye;Z@P~eoxKe zkVrqT(QktL>cbWvTlJ1tXn%su!l!s9gPMx>!GpgM-c#*QQ;I@{YH0h%zqjOixciHE zQr|Ybw2>h@tZKg*;Fi6u>Gu*|P8y3y4B?M7+gMrS*IiGFJxi}Ea`%4eYTk%oHh(=* zdX=?wa@AoR`T5bA>gRkom?v3^Y&oG^?_!%9ZG(2bE_!b~HqRa_ZS&@0Nf$Q`9u=D| zv@u0GG8?BixEuYkXoJ5~V>sJ$eE^GfwTjLBD!Q`T{HCEOQB1v5vSGNbkbd?ofcF=P zzFr|r{@u-Ci;T*6+g?AdMH~i1z|*j=fpr~?OYqB(@4wmOgBQHW@rNi`7y?B3;hE9U zKS9S!l(k>c6T5Y%k7K&_AMzQoR9}vIg?I5C$KaLqaElsVu~Jh*Pb1z0i%XB&%$^si zZnV|c$Ph_Q5x6ETqRpBNFY0rA!`NCk#Uhm-jvv3@o+re2+?k~TPU_I6Sx?{e$;qrv zxziC63m@0hRkenP17r|ed=a%<R4Z-` z$yZ~nyNBv}v2jPFROpQ3!51>4ANw{_AIs?r_gJ2fKV%V~fA#ZhG2ayiI>1R|vz^4> zp*>5pIKENl*2hAYFFF{Fx+7ltsP(kt!A^hgxwU=Hh<&7Y1f7BP%@PBP1;##>B0y!G zHPO5BsV!+?kGnoAG%YHt%DG}3s3qo6b7ThEve@lD#v`y2p8NMiVnQw zMH#`N>s8uZ)5htK;0X5NPS}r9d4S9?{e9$) z%kz1bYpy62zNj!lOfh&|yuE(ojeOtz+&Z#AqO2|h<42=eCg z=Y1oswT5yv6#p7(grrUict@ZO#4cd}_U3yiS|(I5_SeH|Yr;*ne*R7H%u{JMa_i#` zjmzw(q~2tUMjVgk8FiDp`q+D7PS&m7kfx|mXZ7kOKF#>{B^(|L31EO!cTcTPEL?P- zXhnk}4}EY}EpXEZk`>0fJV{5xgdKC~IeVao_h$(>-Xm;f^xKSh1eJ9$Op^=f5}9@D zzIRsiIbVZj53E<4Go|C+XavE|Tz-u$0SZ&wKLk`iMX<(X6Iy z@<-juUqLTCMR3jws?9D{dhyyd<45D}e%A-x3^2LtTW@H&^o3X5*Wdog15>uovxbj3 z{noeVY2+6<_cIPr_4S`m&JqEUaoS|(lbV>o-xYVg`l|Z2zFqJDNkngl;@>$NNG7^)P!$bo5yq6gz1CE&6SPITzP@!@(G@ly8ATG-1gVx8auQx zP=*sg(d`HD>M)~!)G zXt#hlQ@QjSt3bSjInIK#Lr?*AzCQ$*XkR9V>dX&Yy6K z&wLH`Mey%)Hq?DI{~$;)$Hn|{z#)F6hViRM%s#;twp@r>L%v(~UprMU8%tOqK8iq3 z>vMcG4Q>6+JY`m+WvNq(CS>Vml5VO0=L?sT3cttDGUn2E%U}e&(Fn1jrQeU`-@*H$ zjNM#b!yU3wWN@nmb+{IrlTK-%Y|3N0{H+3M@>#%Tig)c74jxmn>uFZ>EA>4U}UT z6%f(=g`1HH$5v-jc}K{pL8Nc8p`|P$+3TegkF0q{Ef6jR`vQQ)kb*=Ws&hf+v4}M0 zRame0Eb!>`!+ue?U3gaX#B{`dL)WO^`PGn`OscgadpasmL;hFx?ikV+yx%Ir$w)D(*f5O|0JDp$43F7&x*c6 zJCsF^R)szf8Om*_TTF>tgQR=ek*~A74AVscg0I)C;L7w!vOh$qAF#) z86AFKum5F5UG-S{8k}Iz&U|LW1101r{#klB-c<5*=Aaq`IABxKOt4YGueob7FHUa4 zo=ucKf+N&goSx2^%(9RvJDUIP%a`7HvD{M~9n!sOp@tfZ*6{jDmvrA|LQ{dC-OK5x z40>E8UCJ39Vylt)q-&=V3Q-h-9BIq5Zn9F$2>WUlbGO z`27o|NHI~DgN41^M)?_+;kI$$8u#liqYg7Y{*o7&>N3qQwP+i={g-(1GdFtZNtpjasyzM1eOaU#yWC)_!F1LC-<7+Fh2eKsVIvo=xSW zmC(k6iDjoxO4E%vev?Or^U2@*HKQQ4HKB_Z}!IHj#52 z*s*{R#hm!bUHC*pT(u+-SGvt)uW9X_!LV#xxwhr?_WX+Z!2We+(0w$|qgI0~^LxOl zNu2wYz{!Cq0B$~5US-r8B)i<_8=V!2t0+0Rn_m8+P4VxZk1`C;ZR3jtK0~D1y<5iv zroKhor9T7ra!~%49t7qn1(TEz4dH;m_@F{v^tOS?8c$aWp=9B99l2?H`XgV(aPZXP zX4sC0!VC3gnE`A6#&Pbvdzbx(?A0f~hsq`f&DV!q$bb@l3F}#T4($J726#=H*7C5l z&XG^Lw!nEksaboTh0KV;e^Kd(`ryUia%JW_hP~HN|pQQ zN|XqV5=_g~3Y_u|*aQ$TxzOILe8#r2Um`I^on_xiG5?eF3$a7J-!a$!%doXYb! zq2wlt{D-!9wq5aWZ`fhm(1Kn9w6tzFO)grTHWMHC`lzf|HB2Qry zQdR@{bq(eoN#$47CZ&~b3M02q=_zn2Y6waG>(=dTnQ65Jy?Rnf8go~tec^pNt-*&I zmAKL(jfxg8cGx_nkK}8v^VF4{Q4u4&rhu?&C~x#x+)?b&dtH#qv9Y-*hXM_fci#xT ziB6L*D^8%twU_*UaF*6NNGNmCaaiYI#sfkMdTV^su_fqmB0J z{`%>DAnFQWH07G7tI{A z+EZL#+)|(TYI4KA6$?nGuvwX3E)7in=r~Y0N6WmY}fVzb`=8kUAWEJ)W-I!<-I$3}_(-^Lh0d>365cd6- zGd!|`oyZM4C!@Gs%&;d*4D&qJ7<=sS9dLIeZxwChvtag2?-VmZKqMBU`ttH%tV}fp z!t7o31IGl7%yVIXN7=JC<)A+H)20j7C%1l7O1AZiUg(17Oo^`?HqD8MyTw|X&kuTh zu*eGjZrSs{zdTWvf9#$Fys?0s2o2_2@)>e#X6x4u**}*c;?AVVi?sEUE)6a@=$JVl zgs6h#T8cUFcE@|1owN)8Yy@Tsm`F?DjrR7js!23s%qB-3mIg~F2BmPsRrDyAK7dkx ztJUAgsb-PW5UM;@2e2qmbsA2=C7fV+ql6yJoJWDxtHsynS=K25nF7$pX3@ujBvV;R zS;zz|2(a^StoV78JWz5LW$P%MFft;$?DDfRb$NB9K`!?kef+JR4GaPd9TQF}F)qHI zI`M}iSwOX5TIgdYC)tPwTyr~~^1?B&@K@-)_zDTR5h>)AU&6s{ zyI|w8lvu-AXEwMe9hz}J+J_y%&$zq;q^G%|`@Dd-Q79FhFwr*MsFsd;vDV(Z9-s=F zk8JtAyV6wAFzo}=x{k~n8#KoDqF?rUwjR4qQdUl9?K89y4Z$*Cd0?9RZ45Kx22FOV zfNH0ZQ0Jrba?S^T34pMM4z~D8y;GETT;tNwxC)7r#1QoH_TF?(3jDS`Ws}{zRH!)5 zqHLc5DU7c=cPSyd@c=MkPcA>9-a*X`^TS(3;!lo%YIZAZE}H^H2KqCkV|YLkeBTXw zwQlk-CRr79zd4lKjeO0GMR=SbH?Ywe-@>BG;$p^H)r-?RA@gp1RDuRr^F{1Me0`b? z&)Q?(vQ${~u=V!oKB~MOm_irE_27Ay06x9&ZKhnf!D*_Sa0Dz@V8q(^Wy#BMDGNEU z?(BD|s}D@n01(2SJYmbU9-JaS#L>;?KlGyTo-`I%r{1fSp;ww0_AyQmvN^9;6z?M_ z2kR8dVNHb~K1%ODGtbgSGd6$=EMG|Ni{;Cfzi2l21_MM;Afc?enarKndTP==sXW#a zo!pi}j6COG_q^lxVAkBWb!Mfx(sYi^@b2dO8WAu5rRF)Gmn%N6H+Hn^8%G+<8vSga zewcLAPLVei^_o=-m`U+E*y`^;vAX+Oy) zg;ag-R%0addSFH@pOq+Ok%lvIfcje`C6aW#X4uAoJJU_4;{nwc7uvPr!-I26`gG6( z`>gY+0+9A-Z>3!S!#u9h~_% zRVF{9YDPElZ22N)hev14=mv+D7&v;5w^arAC8@5oZ-##gKbEq}2?iOj%#N0Z}h$H3J@M&DbUAowkZ(%0j-UmWsaA^N4ze~`M+&zyw1b55%z=qiiz*p1N5JG;H2p)o_p zsS2-bhq9i?sorIOs_<|*z7PE(-5J;u{Hrd7L(+KxJ|#Z%*gK$n!!dA3^AEuA={T1iVP? z9iHK>M%CIqIr|7uc2hD zXHc3=-;3uE(dW>_pCwQ0AP6UkBKGy9^TLX0IgzX}$s?mRA4YQvp_@q3G0x=Ez;92R z5h8>Nh~E2);Rj7TbtA@qvNaK;m=np0@XfdSjlemQQcQ9Ks_#i))C9}Nk5Xsu(=w7& zE1#4@U>HB~!>|$QTyRyOoa>#&*2A|k>*8zw%CU1na(ds`>~?iiRH?Ce{d#oa`i~={ zkVh*8^f?8zyaYvM4R_c=ZT;fewD3hF==mq)7V|@rk7c0_rM<6-D==OQrM)F9A`QMq zCXw;4iO7Ctc6{JiFE)u8w2eo*H783th|v{mth%JISPX-PeKGrDOW^VQ&+a+-%V(hM zJ*A&(MeoX#98CJ90bV4*Q+th3ALS)*{C->R*Cri_Q_3KrPFK8Y_{5j}YKzxT4_xpAL+Tmg`ErVM(yomn?$}P^tRYd_OfLG(3PM_r>W?Xn^Ek?)hJY4gLeUquKc_Y#_P&f8uE$IXyaloX}MOV|k&3JT5fjI`Q#r%*lLM&S>g)SXUOkhqgv z^X(_8{R`b)pN~M~(DZa`v6R(-b(eRlrJUWxbC`*`#-+061I-Oj-UVhbU|FWc`wXI3 zC2hvz6O>U~=g(gU|C0_PoQ%=p6#|mMnRk;vqseR0el+0M=lYsf)}l5y!XkjLyr!7D zaHZ3?`69KP0KkbI>Htn)PpghH&iHW4YoBxL^ETM9`l;9>!W4NA;N4?HAV)AzfsUaA zmZ6tvAOeE*DxwE{7EPdag1=%ziv{|(Poxv1fU_A=nu&4-Hnbs)a?s$`Nav!8mMeTn z0zM?aFv2Z#AmI%%x+%38GXq>%gaFZ%P)sSTiWv~j3lJFrTOUAy9{Bljzp@0Cav~WE zPXQK*0@ksn0t3sGqt5VA*%el2PbBO-Gz2cs&Xp-Y;}&tD%yWyR;pShadWwoqgL) z%jumxwnqIGZc=2;kyd#d3p+{*1$e3L#NRZ8=r>Yf7~s#8^$m~0#R38+4S?UWVFCOF zr%3om8vGg&zGsG9)C=_HMFBvgTL8C3wX5vFhGD9R`@$k0OX?p ev%vqex6r|E>eGd)Gr!^Hf#yZs3oq5I!~O@bRtHf4 literal 0 HcmV?d00001 diff --git a/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo b/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo new file mode 100644 index 0000000000..6a2796c8bc --- /dev/null +++ b/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo @@ -0,0 +1,18 @@ +WARNING: linear_extrude(..., slices=inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=-inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=nan) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices="") parameter could not be converted: expected number, found string in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=true) parameter could not be converted: expected number, found bool in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=[1 : 1 : 3]) parameter could not be converted: expected number, found range in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices=-inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices=nan) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices="") parameter could not be converted: expected number, found string in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices=true) parameter could not be converted: expected number, found bool in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices=[1 : 1 : 3]) parameter could not be converted: expected number, found range in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., scale=inf) could not be converted in file linear_extrude-parameter-tests.scad, line 20 +WARNING: linear_extrude(..., scale=-inf) could not be converted in file linear_extrude-parameter-tests.scad, line 20 +WARNING: linear_extrude(..., scale=nan) could not be converted in file linear_extrude-parameter-tests.scad, line 20 +WARNING: linear_extrude(..., scale="") could not be converted in file linear_extrude-parameter-tests.scad, line 20 +WARNING: linear_extrude(..., scale=true) could not be converted in file linear_extrude-parameter-tests.scad, line 20 +WARNING: linear_extrude(..., scale=[1 : 1 : 3]) could not be converted in file linear_extrude-parameter-tests.scad, line 20 diff --git a/tests/regression/echotest/text-metrics-test-expected.echo b/tests/regression/echotest/text-metrics-test-expected.echo index 6d11d35308..d4ff37940b 100644 --- a/tests/regression/echotest/text-metrics-test-expected.echo +++ b/tests/regression/echotest/text-metrics-test-expected.echo @@ -4,17 +4,17 @@ ECHO: { position = [-116.212, -10.208]; size = [98.96, 20.416]; ascent = 20.1344 ECHO: { nominal = { ascent = 12.5733; descent = -2.9433; }; max = { ascent = 13.6109; descent = -4.2114; }; interline = 15.9709; font = { family = "Liberation Sans"; style = "Regular"; }; } ECHO: { nominal = { ascent = 25.1466; descent = -5.8866; }; max = { ascent = 27.2218; descent = -8.4228; }; interline = 31.9418; font = { family = "Liberation Sans"; style = "Regular"; }; } ECHO: "Errors..." -WARNING: textmetrics() parameter could not be converted: size: expected number, found vector ([]) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: text: expected string, found number (123) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: spacing: expected number, found string ("") in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: font: expected string, found bool (true) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: direction: expected string, found number (0) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: language: expected string, found range ([0 : 1 : 10]) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: script: expected string, found number (0) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: halign: expected string, found number (0) in file text-metrics-test.scad, line 20 -WARNING: textmetrics() parameter could not be converted: valign: expected string, found number (0) in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., size=[]) parameter could not be converted: expected number, found vector in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., text=123) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., spacing="") parameter could not be converted: expected number, found string in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., font=true) parameter could not be converted: expected string, found bool in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., direction=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., language=[0 : 1 : 10]) parameter could not be converted: expected string, found range in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., script=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., halign=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., valign=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 ECHO: { position = [0, 0]; size = [0, 0]; ascent = 0; descent = 0; offset = [0, 0]; advance = [0, 0]; } WARNING: variable text not specified as parameter in file text-metrics-test.scad, line 25 -WARNING: fontmetrics() parameter could not be converted: size: expected number, found bool (true) in file text-metrics-test.scad, line 25 -WARNING: fontmetrics() parameter could not be converted: font: expected string, found number (0) in file text-metrics-test.scad, line 25 +WARNING: fontmetrics(..., size=true) parameter could not be converted: expected number, found bool in file text-metrics-test.scad, line 25 +WARNING: fontmetrics(..., font=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 25 ECHO: { nominal = { ascent = 12.5733; descent = -2.9433; }; max = { ascent = 13.6109; descent = -4.2114; }; interline = 15.9709; font = { family = "Liberation Sans"; style = "Regular"; }; } diff --git a/tests/regression/opencsgtest/issue4432-expected.png b/tests/regression/opencsgtest/issue4432-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..247443d9ef0f548ffbb0b3701ae6d0104629361c GIT binary patch literal 9743 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 literal 0 HcmV?d00001 diff --git a/tests/regression/throwntogethertest/issue4432-expected.png b/tests/regression/throwntogethertest/issue4432-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..9f77af9a31dd5616cd625802b5460faabf103028 GIT binary patch literal 9736 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

i`TjWZuSACt8N-rD$g=An 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 UxfD(AB2 Date: Tue, 6 Dec 2022 12:28:38 -0600 Subject: [PATCH 2/2] Change wording of type warning. --- src/core/Parameters.cc | 6 ++--- ...near_extrude-parameter-tests-expected.echo | 12 +++++----- .../echotest/text-metrics-test-expected.echo | 22 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/core/Parameters.cc b/src/core/Parameters.cc index 851043df2d..10c13ae587 100644 --- a/src/core/Parameters.cc +++ b/src/core/Parameters.cc @@ -275,7 +275,7 @@ void print_argConvert_positioned_warning( } message << ")"; } - message << ", found " << Value::typeName(found.type()) << " " << "(" << found.toEchoStringNoThrow() << ")"; + message << ", found " << found.typeName()) << " " << "(" << found.toEchoStringNoThrow() << ")"; LOG(message_group::Warning, loc, documentRoot, "%1$s", message.str()); } @@ -288,7 +288,7 @@ void print_argConvert_warning( const std::string& documentRoot ) { std::stringstream message; - message << calledName << "(..., " << argName << "=" << found.toEchoStringNoThrow() << ") parameter could not be converted: expected "; + message << calledName << "(..., " << argName << "=" << found.toEchoStringNoThrow() << ") Invalid type: expected "; if (expected.size() == 1) { message << Value::typeName(expected[0]); } else { @@ -299,6 +299,6 @@ void print_argConvert_warning( } message << ")"; } - message << ", found " << Value::typeName(found.type()); + message << ", found " << found.typeName(); LOG(message_group::Warning, loc, documentRoot, "%1$s", message.str()); } diff --git a/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo b/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo index 6a2796c8bc..97971927bb 100644 --- a/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo +++ b/tests/regression/echotest/linear_extrude-parameter-tests-expected.echo @@ -1,15 +1,15 @@ WARNING: linear_extrude(..., slices=inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 14 WARNING: linear_extrude(..., slices=-inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 14 WARNING: linear_extrude(..., slices=nan) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 14 -WARNING: linear_extrude(..., slices="") parameter could not be converted: expected number, found string in file linear_extrude-parameter-tests.scad, line 14 -WARNING: linear_extrude(..., slices=true) parameter could not be converted: expected number, found bool in file linear_extrude-parameter-tests.scad, line 14 -WARNING: linear_extrude(..., slices=[1 : 1 : 3]) parameter could not be converted: expected number, found range in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices="") Invalid type: expected number, found string in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=true) Invalid type: expected number, found bool in file linear_extrude-parameter-tests.scad, line 14 +WARNING: linear_extrude(..., slices=[1 : 1 : 3]) Invalid type: expected number, found range in file linear_extrude-parameter-tests.scad, line 14 WARNING: linear_extrude(..., slices=inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 17 WARNING: linear_extrude(..., slices=-inf) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 17 WARNING: linear_extrude(..., slices=nan) argument cannot be infinite or nan in file linear_extrude-parameter-tests.scad, line 17 -WARNING: linear_extrude(..., slices="") parameter could not be converted: expected number, found string in file linear_extrude-parameter-tests.scad, line 17 -WARNING: linear_extrude(..., slices=true) parameter could not be converted: expected number, found bool in file linear_extrude-parameter-tests.scad, line 17 -WARNING: linear_extrude(..., slices=[1 : 1 : 3]) parameter could not be converted: expected number, found range in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices="") Invalid type: expected number, found string in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices=true) Invalid type: expected number, found bool in file linear_extrude-parameter-tests.scad, line 17 +WARNING: linear_extrude(..., slices=[1 : 1 : 3]) Invalid type: expected number, found range in file linear_extrude-parameter-tests.scad, line 17 WARNING: linear_extrude(..., scale=inf) could not be converted in file linear_extrude-parameter-tests.scad, line 20 WARNING: linear_extrude(..., scale=-inf) could not be converted in file linear_extrude-parameter-tests.scad, line 20 WARNING: linear_extrude(..., scale=nan) could not be converted in file linear_extrude-parameter-tests.scad, line 20 diff --git a/tests/regression/echotest/text-metrics-test-expected.echo b/tests/regression/echotest/text-metrics-test-expected.echo index d4ff37940b..477b09f9e1 100644 --- a/tests/regression/echotest/text-metrics-test-expected.echo +++ b/tests/regression/echotest/text-metrics-test-expected.echo @@ -4,17 +4,17 @@ ECHO: { position = [-116.212, -10.208]; size = [98.96, 20.416]; ascent = 20.1344 ECHO: { nominal = { ascent = 12.5733; descent = -2.9433; }; max = { ascent = 13.6109; descent = -4.2114; }; interline = 15.9709; font = { family = "Liberation Sans"; style = "Regular"; }; } ECHO: { nominal = { ascent = 25.1466; descent = -5.8866; }; max = { ascent = 27.2218; descent = -8.4228; }; interline = 31.9418; font = { family = "Liberation Sans"; style = "Regular"; }; } ECHO: "Errors..." -WARNING: textmetrics(..., size=[]) parameter could not be converted: expected number, found vector in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., text=123) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., spacing="") parameter could not be converted: expected number, found string in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., font=true) parameter could not be converted: expected string, found bool in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., direction=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., language=[0 : 1 : 10]) parameter could not be converted: expected string, found range in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., script=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., halign=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 -WARNING: textmetrics(..., valign=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., size=[]) Invalid type: expected number, found vector in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., text=123) Invalid type: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., spacing="") Invalid type: expected number, found string in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., font=true) Invalid type: expected string, found bool in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., direction=0) Invalid type: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., language=[0 : 1 : 10]) Invalid type: expected string, found range in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., script=0) Invalid type: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., halign=0) Invalid type: expected string, found number in file text-metrics-test.scad, line 20 +WARNING: textmetrics(..., valign=0) Invalid type: expected string, found number in file text-metrics-test.scad, line 20 ECHO: { position = [0, 0]; size = [0, 0]; ascent = 0; descent = 0; offset = [0, 0]; advance = [0, 0]; } WARNING: variable text not specified as parameter in file text-metrics-test.scad, line 25 -WARNING: fontmetrics(..., size=true) parameter could not be converted: expected number, found bool in file text-metrics-test.scad, line 25 -WARNING: fontmetrics(..., font=0) parameter could not be converted: expected string, found number in file text-metrics-test.scad, line 25 +WARNING: fontmetrics(..., size=true) Invalid type: expected number, found bool in file text-metrics-test.scad, line 25 +WARNING: fontmetrics(..., font=0) Invalid type: expected string, found number in file text-metrics-test.scad, line 25 ECHO: { nominal = { ascent = 12.5733; descent = -2.9433; }; max = { ascent = 13.6109; descent = -4.2114; }; interline = 15.9709; font = { family = "Liberation Sans"; style = "Regular"; }; }