Commit 24243b5a by Paolo Carlini Committed by Paolo Carlini

typeck.c (cp_build_unary_op): Consistently use the accurate location in seven…

typeck.c (cp_build_unary_op): Consistently use the accurate location in seven additional diagnostic messages.

/cp
2019-11-26  Paolo Carlini  <paolo.carlini@oracle.com>

	* typeck.c (cp_build_unary_op): Consistently use the accurate
	location in seven additional diagnostic messages.
	(cp_build_compound_expr): Use cp_expr_loc_or_input_loc in one place.

/testsuite
2019-11-26  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp1z/bool-increment1.C: Test location(s) too.
	* g++.dg/expr/bitfield3.C: Likewise.
	* g++.dg/expr/bitfield4.C: Likewise.
	* g++.dg/expr/bitfield5.C: Likewise.
	* g++.dg/expr/bitfield6.C: Likewise.
	* g++.dg/expr/bool1.C: Likewise.
	* g++.dg/expr/bool2.C: Likewise.
	* g++.dg/expr/bool3.C: Likewise.
	* g++.dg/expr/bool4.C: Likewise.
	* g++.dg/expr/lval3.C: Likewise.
	* g++.dg/other/error18.C: Likewise.
	* g++.dg/warn/Wpointer-arith-1.C: Likewise.
	* g++.old-deja/g++.bugs/900212_01.C: Likewise.
	* g++.old-deja/g++.bugs/900428_02.C: Likewise.
	* g++.old-deja/g++.jason/rfg14.C: Likewise.
	* g++.old-deja/g++.other/overload11.C: Likewise.

From-SVN: r278743
parent d86d8b35
2019-11-26 Paolo Carlini <paolo.carlini@oracle.com>
* typeck.c (cp_build_unary_op): Consistently use the accurate
location in seven additional diagnostic messages.
(cp_build_compound_expr): Use cp_expr_loc_or_input_loc in one place.
2019-11-26 Jakub Jelinek <jakub@redhat.com> 2019-11-26 Jakub Jelinek <jakub@redhat.com>
PR c++/92648 PR c++/92648
......
...@@ -6520,7 +6520,8 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert, ...@@ -6520,7 +6520,8 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
if (TREE_CODE (argtype) == ENUMERAL_TYPE) if (TREE_CODE (argtype) == ENUMERAL_TYPE)
{ {
if (complain & tf_error) if (complain & tf_error)
permerror (input_location, (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) permerror (location, (code == PREINCREMENT_EXPR
|| code == POSTINCREMENT_EXPR)
? G_("ISO C++ forbids incrementing an enum") ? G_("ISO C++ forbids incrementing an enum")
: G_("ISO C++ forbids decrementing an enum")); : G_("ISO C++ forbids decrementing an enum"));
else else
...@@ -6536,22 +6537,26 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert, ...@@ -6536,22 +6537,26 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
if (!COMPLETE_OR_VOID_TYPE_P (type)) if (!COMPLETE_OR_VOID_TYPE_P (type))
{ {
if (complain & tf_error) if (complain & tf_error)
error (((code == PREINCREMENT_EXPR error_at (location, ((code == PREINCREMENT_EXPR
|| code == POSTINCREMENT_EXPR)) || code == POSTINCREMENT_EXPR))
? G_("cannot increment a pointer to incomplete type %qT") ? G_("cannot increment a pointer to incomplete "
: G_("cannot decrement a pointer to incomplete type %qT"), "type %qT")
TREE_TYPE (argtype)); : G_("cannot decrement a pointer to incomplete "
"type %qT"),
TREE_TYPE (argtype));
else else
return error_mark_node; return error_mark_node;
} }
else if (!TYPE_PTROB_P (argtype)) else if (!TYPE_PTROB_P (argtype))
{ {
if (complain & tf_error) if (complain & tf_error)
pedwarn (input_location, OPT_Wpointer_arith, pedwarn (location, OPT_Wpointer_arith,
(code == PREINCREMENT_EXPR (code == PREINCREMENT_EXPR
|| code == POSTINCREMENT_EXPR) || code == POSTINCREMENT_EXPR)
? G_("ISO C++ forbids incrementing a pointer of type %qT") ? G_("ISO C++ forbids incrementing a pointer "
: G_("ISO C++ forbids decrementing a pointer of type %qT"), "of type %qT")
: G_("ISO C++ forbids decrementing a pointer "
"of type %qT"),
argtype); argtype);
else else
return error_mark_node; return error_mark_node;
...@@ -6597,8 +6602,9 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert, ...@@ -6597,8 +6602,9 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR) if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
{ {
if (complain & tf_error) if (complain & tf_error)
error ("use of an operand of type %qT in %<operator--%> " error_at (location,
"is forbidden", boolean_type_node); "use of an operand of type %qT in %<operator--%> "
"is forbidden", boolean_type_node);
return error_mark_node; return error_mark_node;
} }
else else
...@@ -6606,16 +6612,18 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert, ...@@ -6606,16 +6612,18 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
if (cxx_dialect >= cxx17) if (cxx_dialect >= cxx17)
{ {
if (complain & tf_error) if (complain & tf_error)
error ("use of an operand of type %qT in " error_at (location,
"%<operator++%> is forbidden in C++17", "use of an operand of type %qT in "
boolean_type_node); "%<operator++%> is forbidden in C++17",
boolean_type_node);
return error_mark_node; return error_mark_node;
} }
/* Otherwise, [depr.incr.bool] says this is deprecated. */ /* Otherwise, [depr.incr.bool] says this is deprecated. */
else else
warning (OPT_Wdeprecated, "use of an operand of type %qT " warning_at (location, OPT_Wdeprecated,
"in %<operator++%> is deprecated", "use of an operand of type %qT "
boolean_type_node); "in %<operator++%> is deprecated",
boolean_type_node);
} }
val = boolean_increment (code, arg); val = boolean_increment (code, arg);
} }
...@@ -6646,7 +6654,7 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert, ...@@ -6646,7 +6654,7 @@ cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
} }
if (complain & tf_error) if (complain & tf_error)
error ("%s", errstring); error_at (location, "%s", errstring);
return error_mark_node; return error_mark_node;
} }
...@@ -7038,7 +7046,8 @@ cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain) ...@@ -7038,7 +7046,8 @@ cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
if (type_unknown_p (rhs)) if (type_unknown_p (rhs))
{ {
if (complain & tf_error) if (complain & tf_error)
error ("no context to resolve type of %qE", rhs); error_at (cp_expr_loc_or_input_loc (rhs),
"no context to resolve type of %qE", rhs);
return error_mark_node; return error_mark_node;
} }
......
2019-11-26 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp1z/bool-increment1.C: Test location(s) too.
* g++.dg/expr/bitfield3.C: Likewise.
* g++.dg/expr/bitfield4.C: Likewise.
* g++.dg/expr/bitfield5.C: Likewise.
* g++.dg/expr/bitfield6.C: Likewise.
* g++.dg/expr/bool1.C: Likewise.
* g++.dg/expr/bool2.C: Likewise.
* g++.dg/expr/bool3.C: Likewise.
* g++.dg/expr/bool4.C: Likewise.
* g++.dg/expr/lval3.C: Likewise.
* g++.dg/other/error18.C: Likewise.
* g++.dg/warn/Wpointer-arith-1.C: Likewise.
* g++.old-deja/g++.bugs/900212_01.C: Likewise.
* g++.old-deja/g++.bugs/900428_02.C: Likewise.
* g++.old-deja/g++.jason/rfg14.C: Likewise.
* g++.old-deja/g++.other/overload11.C: Likewise.
2019-11-26 Martin Sebor <msebor@redhat.com> 2019-11-26 Martin Sebor <msebor@redhat.com>
PR tree-optimization/92683 PR tree-optimization/92683
......
...@@ -5,10 +5,10 @@ fn (bool b) ...@@ -5,10 +5,10 @@ fn (bool b)
{ {
int r = 0; int r = 0;
r += b++; // { dg-error "use of an operand of type .bool. in .operator\\+\\+. is forbidden in" } r += b++; // { dg-error "8:use of an operand of type .bool. in .operator\\+\\+. is forbidden in" }
r += ++b; // { dg-error "use of an operand of type .bool. in .operator\\+\\+. is forbidden in" } r += ++b; // { dg-error "10:use of an operand of type .bool. in .operator\\+\\+. is forbidden in" }
r += b--; // { dg-error "use of an operand of type .bool. in .operator--. is forbidden" } r += b--; // { dg-error "8:use of an operand of type .bool. in .operator--. is forbidden" }
r += --b; // { dg-error "use of an operand of type .bool. in .operator--. is forbidden" } r += --b; // { dg-error "10:use of an operand of type .bool. in .operator--. is forbidden" }
return r; return r;
} }
...@@ -7,6 +7,6 @@ struct S { ...@@ -7,6 +7,6 @@ struct S {
S s; S s;
void f() { void f() {
s.x--; // { dg-error "use of an operand of type .bool." } s.x--; // { dg-error "5:use of an operand of type .bool." }
--s.x; // { dg-error "use of an operand of type .bool." } --s.x; // { dg-error "7:use of an operand of type .bool." }
} }
...@@ -14,8 +14,8 @@ template <> ...@@ -14,8 +14,8 @@ template <>
void f(bool) {} void f(bool) {}
int main() { int main() {
f(s.x++); // { dg-warning "deprecated" "" { target { ! c++17 } } } f(s.x++); // { dg-warning "7:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "forbidden" "" { target c++17 } .-1 }
f(++s.x); // { dg-warning "deprecated" "" { target { ! c++17 } } } f(++s.x); // { dg-warning "9:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "forbidden" "" { target c++17 } .-1 }
} }
...@@ -9,11 +9,11 @@ struct S { ...@@ -9,11 +9,11 @@ struct S {
S s; S s;
int main() { int main() {
s.x++; // { dg-warning "deprecated" "" { target { ! c++17 } } } s.x++; // { dg-warning "5:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "forbidden" "" { target c++17 } .-1 }
if (s.x != 1) if (s.x != 1)
return 1; return 1;
++s.x; // { dg-warning "deprecated" "" { target { ! c++17 } } } ++s.x; // { dg-warning "7:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "forbidden" "" { target c++17 } .-1 }
if (s.x != 1) if (s.x != 1)
return 2; return 2;
......
...@@ -7,6 +7,6 @@ struct S { ...@@ -7,6 +7,6 @@ struct S {
S s; S s;
void f() { void f() {
++s.x = false; // { dg-warning "deprecated" "" { target { ! c++17 } } } ++s.x = false; // { dg-warning "7:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "forbidden" "" { target c++17 } .-1 }
} }
...@@ -11,10 +11,10 @@ int main() ...@@ -11,10 +11,10 @@ int main()
my_bool b = false; my_bool b = false;
int i; int i;
b++; // { dg-warning "deprecated" "" { target { ! c++17 } } } b++; // { dg-warning "3:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "3:use of an operand of type .bool. in .operator\\+\\+. is forbidden" "" { target c++17 } .-1 }
b++; // { dg-warning "deprecated" "" { target { ! c++17 } } } b++; // { dg-warning "3:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "3:use of an operand of type .bool. in .operator\\+\\+. is forbidden" "" { target c++17 } .-1 }
i = b; i = b;
if (i != 1) if (i != 1)
abort (); abort ();
......
...@@ -7,7 +7,7 @@ typedef bool my_bool; ...@@ -7,7 +7,7 @@ typedef bool my_bool;
int main() int main()
{ {
my_bool b = false; my_bool b = false;
b--; // { dg-error "" } b--; // { dg-error "3:use of an operand of type .bool. in .operator\\-\\-. is forbidden" }
return 0; return 0;
} }
...@@ -11,11 +11,11 @@ int main() ...@@ -11,11 +11,11 @@ int main()
my_bool b = false; my_bool b = false;
int i; int i;
b++; // { dg-warning "deprecated" "" { target { ! c++17 } } } b++; // { dg-warning "3:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "3:use of an operand of type .bool. in .operator\\+\\+. is forbidden" "" { target c++17 } .-1 }
// { dg-warning ".volatile.-qualified type is deprecated" "" { target c++2a } .-2 } // { dg-warning ".volatile.-qualified type is deprecated" "" { target c++2a } .-2 }
b++; // { dg-warning "deprecated" "" { target { ! c++17 } } } b++; // { dg-warning "3:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } }
// { dg-error "forbidden" "" { target c++17 } .-1 } // { dg-error "3:use of an operand of type .bool. in .operator\\+\\+. is forbidden" "" { target c++17 } .-1 }
// { dg-warning ".volatile.-qualified type is deprecated" "" { target c++2a } .-2 } // { dg-warning ".volatile.-qualified type is deprecated" "" { target c++2a } .-2 }
i = b; i = b;
if (i != 1) if (i != 1)
......
...@@ -7,7 +7,7 @@ typedef volatile bool my_bool; ...@@ -7,7 +7,7 @@ typedef volatile bool my_bool;
int main() int main()
{ {
my_bool b = false; my_bool b = false;
b--; // { dg-error "" } b--; // { dg-error "3:use of an operand of type .bool. in .operator\\-\\-. is forbidden" }
// { dg-warning ".volatile.-qualified type is deprecated" "" { target c++2a } .-1 } // { dg-warning ".volatile.-qualified type is deprecated" "" { target c++2a } .-1 }
return 0; return 0;
} }
...@@ -4,5 +4,5 @@ f() ...@@ -4,5 +4,5 @@ f()
{ {
bool i = 0; bool i = 0;
i++ = 3; // { dg-error "" } i++ = 3; // { dg-error "" }
// { dg-warning "deprecated" "" { target { ! c++17 } } .-1 } // { dg-warning "3:use of an operand of type .bool. in .operator\\+\\+. is deprecated" "" { target { ! c++17 } } .-1 }
} }
...@@ -7,5 +7,5 @@ struct A ...@@ -7,5 +7,5 @@ struct A
void f(A a) void f(A a)
{ {
a.b--; // { dg-error "use of an operand of type .bool." } a.b--; // { dg-error "5:use of an operand of type .bool." }
} }
...@@ -4,10 +4,10 @@ ...@@ -4,10 +4,10 @@
int main() int main()
{ {
void *pv = 0; void *pv = 0;
pv++; // { dg-warning "forbids incrementing a pointer" } pv++; // { dg-warning "3:ISO C\\+\\+ forbids incrementing a pointer" }
typedef void (*pft) (); typedef void (*pft) ();
pft pf = 0; pft pf = 0;
pf++; // { dg-warning "forbids incrementing a pointer" } pf++; // { dg-warning "3:ISO C\\+\\+ forbids incrementing a pointer" }
} }
...@@ -23,17 +23,17 @@ void global_function_0 () ...@@ -23,17 +23,17 @@ void global_function_0 ()
{ {
p0 = p1 + 3; // { dg-error "" } p0 = p1 + 3; // { dg-error "" }
p0 = p1 - 3; // { dg-error "" } p0 = p1 - 3; // { dg-error "" }
p1++; /* { dg-error "" } caught by g++ */ p1++; /* { dg-error "3:no post-increment" } caught by g++ */
++p1; /* { dg-error "" } caught by g++ */ ++p1; /* { dg-error "5:no pre-increment" } caught by g++ */
p1--; /* { dg-error "" } caught by g++ */ p1--; /* { dg-error "3:no post-decrement" } caught by g++ */
--p1; /* { dg-error "" } caught by g++ */ --p1; /* { dg-error "5:no pre-decrement" } caught by g++ */
fp0 = fp1 + 3; // { dg-error "" } fp0 = fp1 + 3; // { dg-error "" }
fp0 = fp1 - 3; // { dg-error "" } fp0 = fp1 - 3; // { dg-error "" }
fp1++; /* { dg-error "" } */ fp1++; /* { dg-error "3:no post-increment" } */
++fp1; /* { dg-error "" } */ ++fp1; /* { dg-error "5:no pre-increment" } */
fp1--; /* { dg-error "" } */ fp1--; /* { dg-error "3:no post-decrement" } */
--fp1; /* { dg-error "" } */ --fp1; /* { dg-error "5:no pre-decrement" } */
} }
int main () { return 0; } int main () { return 0; }
...@@ -15,13 +15,13 @@ void (*fp) (); ...@@ -15,13 +15,13 @@ void (*fp) ();
void test () void test ()
{ {
vp++; /* { dg-error "" } */ vp++; /* { dg-error "3:ISO C\\+\\+ forbids incrementing" } */
++vp; /* { dg-error "" } */ ++vp; /* { dg-error "5:ISO C\\+\\+ forbids incrementing" } */
vp--; /* { dg-error "" } */ vp--; /* { dg-error "3:ISO C\\+\\+ forbids decrementing" } */
--vp; /* { dg-error "" } */ --vp; /* { dg-error "5:ISO C\\+\\+ forbids decrementing" } */
fp++; /* { dg-error "" } */ fp++; /* { dg-error "3:ISO C\\+\\+ forbids incrementing" } */
++fp; /* { dg-error "" } */ ++fp; /* { dg-error "5:ISO C\\+\\+ forbids incrementing" } */
fp--; /* { dg-error "" } */ fp--; /* { dg-error "3:ISO C\\+\\+ forbids decrementing" } */
--fp; /* { dg-error "" } */ --fp; /* { dg-error "5:ISO C\\+\\+ forbids decrementing" } */
} }
...@@ -8,9 +8,9 @@ int (*fp)(); ...@@ -8,9 +8,9 @@ int (*fp)();
void void
test () test ()
{ {
vp++; /* { dg-error "" } incrementing void * */ vp++; /* { dg-error "5:ISO C\\+\\+ forbids incrementing" } incrementing void * */
ap++; /* { dg-error "" } incrementing ptr to incomplete type */ ap++; /* { dg-error "5:cannot increment" } incrementing ptr to incomplete type */
sp++; /* { dg-error "" } incrementing ptr to incomplete type */ sp++; /* { dg-error "5:cannot increment" } incrementing ptr to incomplete type */
up++; /* { dg-error "" } incrementing ptr to incomplete type */ up++; /* { dg-error "5:cannot increment" } incrementing ptr to incomplete type */
fp++; /* { dg-error "" } incrementing ptr to function */ fp++; /* { dg-error "5:ISO C\\+\\+ forbids incrementing" } incrementing ptr to function */
} }
...@@ -38,8 +38,8 @@ int main (int argc, char **argv) ...@@ -38,8 +38,8 @@ int main (int argc, char **argv)
// 13.3.1.1 indicates that the following are errors -- the primary expression // 13.3.1.1 indicates that the following are errors -- the primary expression
// is not the name of a function. // is not the name of a function.
(0, ovl) (1); // { dg-error "" } not suitable for overload resolution (0, ovl) (1); // { dg-error "7:no context" } not suitable for overload resolution
(0, &ovl) (1); // { dg-error "" } not suitable for overload resolution (0, &ovl) (1); // { dg-error "7:no context" } not suitable for overload resolution
(argc ? ovl : ovl) (1); // { dg-error "" } not suitable for overload resolution (argc ? ovl : ovl) (1); // { dg-error "" } not suitable for overload resolution
(argc ? &ovl : &ovl) (1); // { dg-error "" } not suitable for overload resolution (argc ? &ovl : &ovl) (1); // { dg-error "" } not suitable for overload resolution
...@@ -52,15 +52,15 @@ int main (int argc, char **argv) ...@@ -52,15 +52,15 @@ int main (int argc, char **argv)
ptr = (ovl); // ok ptr = (ovl); // ok
ptr = (&ovl); // ok ptr = (&ovl); // ok
ptr = (0, ovl); // ok { dg-error "no context" } ptr = (0, ovl); // ok { dg-error "13:no context" }
ptr = (0, &ovl); // ok { dg-error "no context" } ptr = (0, &ovl); // ok { dg-error "13:no context" }
ptr = (argc ? ovl : ovl); // ok { dg-error "no context" } ptr = (argc ? ovl : ovl); // ok { dg-error "no context" }
ptr = (argc ? &ovl : &ovl);// ok { dg-error "no context" } ptr = (argc ? &ovl : &ovl);// ok { dg-error "no context" }
vptr = (ovl); // { dg-error "" } no matching candidates vptr = (ovl); // { dg-error "" } no matching candidates
vptr = (&ovl); // { dg-error "" } no matching candidates vptr = (&ovl); // { dg-error "" } no matching candidates
vptr = (0, ovl); // { dg-error "" } no matching candidates vptr = (0, ovl); // { dg-error "14:no context" } no matching candidates
vptr = (0, &ovl); // { dg-error "" } no matching candidates vptr = (0, &ovl); // { dg-error "14:no context" } no matching candidates
vptr = (argc ? ovl : ovl); // { dg-error "" } no matching candidates vptr = (argc ? ovl : ovl); // { dg-error "" } no matching candidates
vptr = (argc ? &ovl : &ovl);// { dg-error "" } no matching candidates vptr = (argc ? &ovl : &ovl);// { dg-error "" } no matching candidates
...@@ -81,11 +81,11 @@ int main (int argc, char **argv) ...@@ -81,11 +81,11 @@ int main (int argc, char **argv)
static_cast<void>(ovl); // { dg-error "" } not suitable for overload static_cast<void>(ovl); // { dg-error "" } not suitable for overload
static_cast<void>(&ovl); // { dg-error "" } not suitable for overload static_cast<void>(&ovl); // { dg-error "" } not suitable for overload
((void)1, f); // { dg-warning "" "" { xfail *-*-* } } not a call ((void)1, f); // { dg-warning "" "" { xfail *-*-* } } not a call
((void)1, ovl); // { dg-error "" } not suitable for overload ((void)1, ovl); // { dg-error "13:no context" } not suitable for overload
((void)1, &ovl); // { dg-error "" } not suitable for overload ((void)1, &ovl); // { dg-error "13:no context" } not suitable for overload
(void)((void)1, f); // ok (void)((void)1, f); // ok
(void)((void)1, ovl); // { dg-error "" } not suitable for overload (void)((void)1, ovl); // { dg-error "19:no context" } not suitable for overload
(void)((void)1, &ovl); // { dg-error "" } not suitable for overload (void)((void)1, &ovl); // { dg-error "19:no context" } not suitable for overload
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment