From: Marek Polacek Date: Fri, 23 Aug 2019 23:26:17 +0000 (+0000) Subject: PR c++/91521 - wrong error with operator->. X-Git-Tag: releases/gcc-9.3.0~688 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=736257f74fa51f582832482fd8654f2cef8da891;p=thirdparty%2Fgcc.git PR c++/91521 - wrong error with operator->. * decl.c (grokdeclarator): Return error_mark_node for an invalid trailing return type. * g++.dg/parse/operator8.C: New test. From-SVN: r274892 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 512e4e7ac15f..adc0a8397088 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2019-08-23 Marek Polacek + + Backported from mainline + 2019-08-23 Marek Polacek + + PR c++/91521 - wrong error with operator->. + * decl.c (grokdeclarator): Return error_mark_node for an invalid + trailing return type. + 2019-08-16 Jason Merrill PR c++/90393 - ICE with throw in ?: diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 92e58af8c144..05ceda89d4c9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11436,6 +11436,8 @@ grokdeclarator (const cp_declarator *declarator, else if (late_return_type && sfk != sfk_conversion) { + if (late_return_type == error_mark_node) + return error_mark_node; if (cxx_dialect < cxx11) /* Not using maybe_warn_cpp0x because this should always be an error. */ diff --git a/gcc/testsuite/g++.dg/parse/operator8.C b/gcc/testsuite/g++.dg/parse/operator8.C new file mode 100644 index 000000000000..c5ee3eb934ab --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator8.C @@ -0,0 +1,13 @@ +// PR c++/91521 - wrong error with operator->. +// { dg-do compile } + +struct foo { + int bar() { return 0; } + foo* operator->() { return this; } +}; + +int main() +{ + int pt(foo()->bar()); + return pt; +}