Skip to content

Commit 17c7c2a

Browse files
committed
Check for null in default violation handlers
And rename `violation` to `report_violation`, that function name should have a verb Resolved this comment: 0827bab#r135449187
1 parent fd791a4 commit 17c7c2a

30 files changed

+171
-170
lines changed

include/cpp2util.h

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,16 @@ class contract_group {
403403
constexpr auto set_handler(handler h = {}) { reporter = h; }
404404
constexpr auto get_handler() const -> handler { return reporter; }
405405
constexpr auto has_handler() const -> bool { return reporter != handler{}; }
406-
constexpr auto expects (bool b, CPP2_MESSAGE_PARAM msg = "" CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT)
406+
407+
constexpr auto report_violation(CPP2_MESSAGE_PARAM msg = "" CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT)
408+
-> void { if (reporter) reporter(msg CPP2_SOURCE_LOCATION_ARG); }
409+
410+
// deprecated
411+
constexpr auto enforce(bool b, CPP2_MESSAGE_PARAM msg = "" CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT)
407412
-> void { if (!b) reporter(msg CPP2_SOURCE_LOCATION_ARG); }
408-
constexpr auto violation (CPP2_MESSAGE_PARAM msg = "" CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT)
409-
-> void { reporter(msg CPP2_SOURCE_LOCATION_ARG); }
413+
constexpr auto violation(CPP2_MESSAGE_PARAM msg = "" CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT)
414+
-> void { if (reporter) reporter(msg CPP2_SOURCE_LOCATION_ARG); }
415+
410416
private:
411417
handler reporter;
412418
};
@@ -419,7 +425,7 @@ class contract_group {
419425
<< where.function_name() << ": "
420426
#endif
421427
<< group << " violation";
422-
if (msg[0] != '\0') {
428+
if (msg && msg[0] != '\0') {
423429
std::cerr << ": " << msg;
424430
}
425431
std::cerr << "\n";
@@ -461,7 +467,9 @@ auto assert_not_null(auto&& p CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> declty
461467
// doesn't guarantee that using == and != will reliably report whether an
462468
// STL iterator has the default-constructed value. So use it only for raw *...
463469
if constexpr (std::is_pointer_v<CPP2_TYPEOF(p)>) {
464-
Null.expects(p != CPP2_TYPEOF(p){}, "dynamic null dereference attempt detected" CPP2_SOURCE_LOCATION_ARG);
470+
if (p == CPP2_TYPEOF(p){}) {
471+
Null.report_violation("dynamic null dereference attempt detected" CPP2_SOURCE_LOCATION_ARG);
472+
};
465473
}
466474
return CPP2_FORWARD(p);
467475
}
@@ -483,7 +491,9 @@ auto assert_in_bounds_impl(auto&& x, auto&& arg CPP2_SOURCE_LOCATION_PARAM_WITH_
483491
else {
484492
msg += "but container is empty";
485493
}
486-
Bounds.expects(0 <= arg && arg < max(), msg.c_str() CPP2_SOURCE_LOCATION_ARG);
494+
if (!(0 <= arg && arg < max())) {
495+
Bounds.report_violation(msg.c_str() CPP2_SOURCE_LOCATION_ARG);
496+
}
487497
}
488498

489499
auto assert_in_bounds_impl(auto&&, auto&& CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> void
@@ -510,10 +520,11 @@ auto assert_in_bounds_impl(auto&&, auto&& CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAUL
510520

511521
[[noreturn]] auto Throw(auto&& x, [[maybe_unused]] char const* msg) -> void {
512522
#ifdef CPP2_NO_EXCEPTIONS
513-
Type.expects(
514-
!"exceptions are disabled with -fno-exceptions",
515-
msg
516-
);
523+
auto err = std::string{"exceptions are disabled with -fno-exceptions - attempted to throw exception with type \"" + typeid(decltype(x)).name() + "\""};
524+
if (msg) {
525+
err += " and the message \"" + msg + "\"";
526+
}
527+
Type.report_violation( msg );
517528
std::terminate();
518529
#else
519530
throw CPP2_FORWARD(x);
@@ -531,10 +542,7 @@ inline auto Uncaught_exceptions() -> int {
531542
template<typename T>
532543
auto Dynamic_cast( [[maybe_unused]] auto&& x ) -> decltype(auto) {
533544
#ifdef CPP2_NO_RTTI
534-
Type.expects(
535-
!"'as' dynamic casting is disabled with -fno-rtti", // more likely to appear on console
536-
"'as' dynamic casting is disabled with -fno-rtti" // make message available to hooked handlers
537-
);
545+
Type.report_violation( "'as' dynamic casting is disabled with -fno-rtti" );
538546
return nullptr;
539547
#else
540548
return dynamic_cast<T>(CPP2_FORWARD(x));
@@ -544,25 +552,19 @@ auto Dynamic_cast( [[maybe_unused]] auto&& x ) -> decltype(auto) {
544552
template<typename T>
545553
auto Typeid() -> decltype(auto) {
546554
#ifdef CPP2_NO_RTTI
547-
Type.expects(
548-
!"'any' dynamic casting is disabled with -fno-rtti", // more likely to appear on console
549-
"'any' dynamic casting is disabled with -fno-rtti" // make message available to hooked handlers
550-
);
555+
Type.report_violation( "'any' dynamic casting is disabled with -fno-rtti" );
551556
#else
552557
return typeid(T);
553558
#endif
554559
}
555560

556-
// We don't need typeid(expr) yet -- uncomment this if/when we need it
557-
//auto Typeid( [[maybe_unused]] auto&& x ) -> decltype(auto) {
558-
//#ifdef CPP2_NO_RTTI
559-
// Type.expects(
560-
// !"<write appropriate error message here>"
561-
// );
562-
//#else
563-
// return typeid(CPP2_FORWARD(x));
564-
//#endif
565-
//}
561+
auto Typeid( [[maybe_unused]] auto&& x ) -> decltype(auto) {
562+
#ifdef CPP2_NO_RTTI
563+
Type.report_violation( "'typeid' is disabled with -fno-rtti" );
564+
#else
565+
return typeid(CPP2_FORWARD(x));
566+
#endif
567+
}
566568

567569

568570
//-----------------------------------------------------------------------
@@ -674,9 +676,9 @@ class deferred_init {
674676
public:
675677
deferred_init() noexcept { }
676678
~deferred_init() noexcept { destroy(); }
677-
auto value() noexcept -> T& { Default.expects(init); return t(); }
679+
auto value() noexcept -> T& { Default.enforce(init); return t(); }
678680

679-
auto construct(auto&& ...args) -> void { Default.expects(!init); new (&data) T{CPP2_FORWARD(args)...}; init = true; }
681+
auto construct(auto&& ...args) -> void { Default.enforce(!init); new (&data) T{CPP2_FORWARD(args)...}; init = true; }
680682
};
681683

682684

@@ -696,9 +698,9 @@ class out {
696698
bool called_construct_ = false;
697699

698700
public:
699-
out(T* t_) noexcept : t{ t_}, has_t{true} { Default.expects( t); }
700-
out(deferred_init<T>* dt_) noexcept : dt{dt_}, has_t{false} { Default.expects(dt); }
701-
out(out<T>* ot_) noexcept : ot{ot_}, has_t{ot_->has_t} { Default.expects(ot);
701+
out(T* t_) noexcept : t{ t_}, has_t{true} { Default.enforce( t); }
702+
out(deferred_init<T>* dt_) noexcept : dt{dt_}, has_t{false} { Default.enforce(dt); }
703+
out(out<T>* ot_) noexcept : ot{ot_}, has_t{ot_->has_t} { Default.enforce(ot);
702704
if (has_t) { t = ot->t; }
703705
else { dt = ot->dt; }
704706
}
@@ -712,7 +714,7 @@ class out {
712714
// then leave it in the same state on exit (strong guarantee)
713715
~out() {
714716
if (called_construct() && uncaught_count != Uncaught_exceptions()) {
715-
Default.expects(!has_t);
717+
Default.enforce(!has_t);
716718
dt->destroy();
717719
called_construct() = false;
718720
}
@@ -721,21 +723,21 @@ class out {
721723
auto construct(auto&& ...args) -> void {
722724
if (has_t || called_construct()) {
723725
if constexpr (requires { *t = T(CPP2_FORWARD(args)...); }) {
724-
Default.expects( t );
726+
Default.enforce( t );
725727
*t = T(CPP2_FORWARD(args)...);
726728
}
727729
else {
728-
Default.expects(false, "attempted to copy assign, but copy assignment is not available");
730+
Default.enforce(false, "attempted to copy assign, but copy assignment is not available");
729731
}
730732
}
731733
else {
732-
Default.expects( dt );
734+
Default.enforce( dt );
733735
if (dt->init) {
734736
if constexpr (requires { *t = T(CPP2_FORWARD(args)...); }) {
735737
dt->value() = T(CPP2_FORWARD(args)...);
736738
}
737739
else {
738-
Default.expects(false, "attempted to copy assign, but copy assignment is not available");
740+
Default.enforce(false, "attempted to copy assign, but copy assignment is not available");
739741
}
740742
}
741743
else {
@@ -747,11 +749,11 @@ class out {
747749

748750
auto value() noexcept -> T& {
749751
if (has_t) {
750-
Default.expects( t );
752+
Default.enforce( t );
751753
return *t;
752754
}
753755
else {
754-
Default.expects( dt );
756+
Default.enforce( dt );
755757
return dt->value();
756758
}
757759
}
@@ -1201,7 +1203,7 @@ inline constexpr auto as(auto const& x CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT)
12011203
)
12021204
{
12031205
const C c = static_cast<C>(x);
1204-
Type.expects( // precondition check: must be round-trippable => not lossy
1206+
Type.enforce( // precondition check: must be round-trippable => not lossy
12051207
static_cast<CPP2_TYPEOF(x)>(c) == x && (c < C{}) == (x < CPP2_TYPEOF(x){}),
12061208
"dynamic lossy narrowing conversion attempt detected" CPP2_SOURCE_LOCATION_ARG
12071209
);
Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,118 @@
11
mixed-bugfix-for-ufcs-non-local.cpp2:13:12: error: a lambda expression cannot appear in this context
22
template<t<CPP2_UFCS_NONLOCAL(f)(o)> _> bool inline constexpr v0 = false;// Fails on GCC ([GCC109781][]) and Clang 12 (a lambda expression cannot appear in this context)
33
^
4-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
4+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
55
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
66
^
7-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
7+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
88
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
99
^
1010
mixed-bugfix-for-ufcs-non-local.cpp2:15:3: error: a lambda expression cannot appear in this context
1111
t<CPP2_UFCS_NONLOCAL(f)(o)> inline constexpr v1 = t<true>();// Fails on Clang 12 (lambda in unevaluated context).
1212
^
13-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
13+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
1414
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
1515
^
16-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
16+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
1717
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
1818
^
1919
mixed-bugfix-for-ufcs-non-local.cpp2:21:12: error: a lambda expression cannot appear in this context
2020
template<t<CPP2_UFCS_NONLOCAL(f)(o)> _> auto g() -> void;
2121
^
22-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
22+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
2323
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
2424
^
25-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
25+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
2626
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
2727
^
2828
mixed-bugfix-for-ufcs-non-local.cpp2:23:36: error: a lambda expression cannot appear in this context
2929
auto g([[maybe_unused]] cpp2::in<t<CPP2_UFCS_NONLOCAL(f)(o)>> unnamed_param_1) -> void;
3030
^
31-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
31+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
3232
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
3333
^
34-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
34+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
3535
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
3636
^
3737
mixed-bugfix-for-ufcs-non-local.cpp2:27:29: error: a lambda expression cannot appear in this context
3838
[[nodiscard]] auto h() -> t<CPP2_UFCS_NONLOCAL(f)(o)>;
3939
^
40-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
40+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
4141
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
4242
^
43-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
43+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
4444
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
4545
^
4646
mixed-bugfix-for-ufcs-non-local.cpp2:31:12: error: a lambda expression cannot appear in this context
4747
template<t<CPP2_UFCS_NONLOCAL(f)(o)> _> using a = bool;// Fails on GCC ([GCC109781][]) and Clang 12 (a lambda expression cannot appear in this context)
4848
^
49-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
49+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
5050
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
5151
^
52-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
52+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
5353
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
5454
^
5555
mixed-bugfix-for-ufcs-non-local.cpp2:33:12: error: a lambda expression cannot appear in this context
5656
template<t<CPP2_UFCS_NONLOCAL(f)(o)> _> auto inline constexpr b = false;// Fails on GCC ([GCC109781][]).
5757
^
58-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
58+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
5959
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
6060
^
61-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
61+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
6262
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
6363
^
6464
mixed-bugfix-for-ufcs-non-local.cpp2:35:13: error: a lambda expression cannot appear in this context
6565
using c = t<CPP2_UFCS_NONLOCAL(f)(o)>;// Fails on Clang 12 (lambda in unevaluated context) and Clang 12 (a lambda expression cannot appear in this context)
6666
^
67-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
67+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
6868
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
6969
^
70-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
70+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
7171
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
7272
^
7373
mixed-bugfix-for-ufcs-non-local.cpp2:37:29: error: a lambda expression cannot appear in this context
7474
auto inline constexpr d = t<CPP2_UFCS_NONLOCAL(f)(o)>();// Fails on Clang 12 (lambda in unevaluated context).
7575
^
76-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
76+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
7777
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
7878
^
79-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
79+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
8080
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
8181
^
8282
mixed-bugfix-for-ufcs-non-local.cpp2:21:12: error: a lambda expression cannot appear in this context
8383
template<t<CPP2_UFCS_NONLOCAL(f)(o)> _> auto g() -> void{}// Fails on GCC ([GCC109781][]) and Clang 12 (a lambda expression cannot appear in this context)
8484
^
85-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
85+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
8686
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
8787
^
88-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
88+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
8989
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
9090
^
9191
mixed-bugfix-for-ufcs-non-local.cpp2:23:36: error: a lambda expression cannot appear in this context
9292
auto g([[maybe_unused]] cpp2::in<t<CPP2_UFCS_NONLOCAL(f)(o)>> unnamed_param_1) -> void{}// Fails on Clang 12 (lambda in unevaluated context).
9393
^
94-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
94+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
9595
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
9696
^
97-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
97+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
9898
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
9999
^
100100
mixed-bugfix-for-ufcs-non-local.cpp2:27:29: error: a lambda expression cannot appear in this context
101101
[[nodiscard]] auto h() -> t<CPP2_UFCS_NONLOCAL(f)(o)> { return o; }// Fails on Clang 12 (lambda in unevaluated context).
102102
^
103-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
103+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
104104
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
105105
^
106-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
106+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
107107
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
108108
^
109109
mixed-bugfix-for-ufcs-non-local.cpp2:41:79: error: lambda expression in an unevaluated operand
110110
inline CPP2_CONSTEXPR bool u::c = [](cpp2::in<std::type_identity_t<decltype(CPP2_UFCS_NONLOCAL(f)(o))>> x) mutable -> auto { return x; }(true);// Fails on Clang 12 (lambda in unevaluated context).
111111
^
112-
../../../include/cpp2util.h:875:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
112+
../../../include/cpp2util.h:877:59: note: expanded from macro 'CPP2_UFCS_NONLOCAL'
113113
#define CPP2_UFCS_NONLOCAL(...) CPP2_UFCS_(,(),,__VA_ARGS__)
114114
^
115-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
115+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
116116
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
117117
^
118118
13 errors generated.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
pure2-bugfix-for-ufcs-noexcept.cpp2:5:26: error: lambda expression in an unevaluated operand
22
static_assert(noexcept(CPP2_UFCS(swap)(t(), t())));// Fails on Clang 12 (lambda in unevaluated context) and GCC 10 (static assertion failed)
33
^
4-
../../../include/cpp2util.h:872:59: note: expanded from macro 'CPP2_UFCS'
4+
../../../include/cpp2util.h:874:59: note: expanded from macro 'CPP2_UFCS'
55
#define CPP2_UFCS(...) CPP2_UFCS_(&,(),,__VA_ARGS__)
66
^
7-
../../../include/cpp2util.h:856:53: note: expanded from macro 'CPP2_UFCS_'
7+
../../../include/cpp2util.h:858:53: note: expanded from macro 'CPP2_UFCS_'
88
#define CPP2_UFCS_(LAMBDADEFCAPT,QUALID,TEMPKW,...) \
99
^
1010
1 error generated.

0 commit comments

Comments
 (0)