From: Jakub Jelinek Date: Wed, 12 Apr 2023 13:16:31 +0000 (+0200) Subject: testsuite: Add testcase for recently fixed PR [PR109462] X-Git-Tag: basepoints/gcc-14~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=14f0ea22413fe3e64306c57fbfd2ae7b5769c1a1;p=thirdparty%2Fgcc.git testsuite: Add testcase for recently fixed PR [PR109462] This adds a runtime testcase for just fixed PR. 2023-04-12 Jakub Jelinek PR tree-optimization/109462 * g++.dg/opt/pr109462.C: New test. --- diff --git a/gcc/testsuite/g++.dg/opt/pr109462.C b/gcc/testsuite/g++.dg/opt/pr109462.C new file mode 100644 index 000000000000..07ac7c5d4fb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr109462.C @@ -0,0 +1,94 @@ +// PR tree-optimization/109462 +// { dg-do run { target c++11 } } +// { dg-options "-O2" } + +struct A { + A (const char *); + A (const char *, int); + bool empty (); + int size (); + bool equals (A); + A trim (char); + A trim (); +}; +[[gnu::noipa]] A::A (const char *) {} +[[gnu::noipa]] A::A (const char *, int) { __builtin_abort (); } +[[gnu::noipa]] bool A::empty () { __builtin_abort (); } +[[gnu::noipa]] int A::size () { __builtin_abort (); } +[[gnu::noipa]] bool A::equals (A) { return true; } +[[gnu::noipa]] A A::trim (char) { __builtin_abort (); } +[[gnu::noipa]] A A::trim () { __builtin_abort (); } + +enum B { raw_identifier = 6, l_paren = 21, r_paren = 22 }; +[[gnu::noipa]] bool isAnyIdentifier (B) { return true; } +[[gnu::noipa]] bool isStringLiteral (B) { __builtin_abort (); } + +struct C { + B c; + B getKind () { return c; } + bool is (B x) { return c == x; } + unsigned getLength () { __builtin_abort (); } + A getRawIdentifier () { + A x (""); + c == raw_identifier ? void () : __builtin_abort (); + return x; + } + const char *getLiteralData (); +}; +[[gnu::noipa]] const char *C::getLiteralData () { __builtin_abort (); } + +struct D { + D (); + bool LexFromRawLexer (C &); +}; +[[gnu::noipa]] D::D () {} +[[gnu::noipa]] bool D::LexFromRawLexer (C &t) { + static int cnt; + C tok[] = { { raw_identifier }, { l_paren }, { raw_identifier }, { r_paren } }; + t = tok[cnt++]; + return false; +} + +bool ok = false; +[[gnu::noipa]] void reportEmptyContextError () +{ + ok = true; +} + +[[gnu::noipa]] void +VisitObjCMessageExpr () +{ + D TheLexer; + C I; + C Result; + int p_count = 0; + while (!TheLexer.LexFromRawLexer (I)) { + if (I.getKind () == l_paren) + ++p_count; + if (I.getKind () == r_paren) { + if (p_count == 1) + break; + --p_count; + } + Result = I; + } + if (isAnyIdentifier (Result.getKind ())) { + if (Result.getRawIdentifier ().equals ("nil")) { + reportEmptyContextError (); + return; + } + } + if (!isStringLiteral (Result.getKind ())) + return; + A Comment = A (Result.getLiteralData (), Result.getLength ()).trim ('"'); + if ((Comment.trim ().size () == 0 && Comment.size () > 0) || Comment.empty ()) + reportEmptyContextError (); +} + +int +main () +{ + VisitObjCMessageExpr (); + if (!ok) + __builtin_abort (); +}