From: Patrick Palka Date: Mon, 27 Dec 2021 14:05:17 +0000 (-0500) Subject: c++: hard error w/ ptr+N and incomplete type [PR103700] X-Git-Tag: upstream/12.2.0~2574 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=88cdcb5c18d73bfc9960d774c678f0e8103b8031;p=platform%2Fupstream%2Fgcc.git c++: hard error w/ ptr+N and incomplete type [PR103700] In pointer_int_sum when called from a SFINAE context, we need to avoid calling size_in_bytes_loc on an incomplete pointed-to type since this latter function isn't SFINAE-enabled and always emits an error on such input. PR c++/103700 gcc/c-family/ChangeLog: * c-common.c (pointer_int_sum): When quiet, return error_mark_node for an incomplete pointed-to type and don't call size_in_bytes_loc. gcc/testsuite/ChangeLog: * g++.dg/template/sfinae32.C: New test. --- diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index a25d59f..f3e3e9b 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -3308,6 +3308,8 @@ pointer_int_sum (location_t loc, enum tree_code resultcode, size_exp = integer_one_node; else { + if (!complain && !COMPLETE_TYPE_P (TREE_TYPE (result_type))) + return error_mark_node; size_exp = size_in_bytes_loc (loc, TREE_TYPE (result_type)); /* Wrap the pointer expression in a SAVE_EXPR to make sure it is evaluated first when the size expression may depend diff --git a/gcc/testsuite/g++.dg/template/sfinae32.C b/gcc/testsuite/g++.dg/template/sfinae32.C new file mode 100644 index 0000000..ae1dada --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae32.C @@ -0,0 +1,24 @@ +// PR c++/103700 +// { dg-do compile { target c++11 } } + +template auto f(T* p) -> decltype(p + N); +template auto f(T* p) -> decltype(p - N); +template auto f(T* p) -> decltype(N + p); +template void f(T* p); + +template auto g(T* p, int n) -> decltype(p + n); +template auto g(T* p, int n) -> decltype(p - n); +template auto g(T* p, int n) -> decltype(n + p); +template void g(T* p, int n); + +struct Incomplete; + +int main() { + f(nullptr); + f(nullptr); + f(nullptr); + f(nullptr); + f(nullptr); + + g(nullptr, 0); +}