diff options
author | Marek Polacek <polacek@redhat.com> | 2017-02-14 17:33:21 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2017-02-14 17:33:21 +0000 |
commit | 6f207d5810934c0156cda61a12a56ff1915adb79 (patch) | |
tree | ef7fa14d23662415cd3f8e34f9468481f5ff75ab /gcc | |
parent | ee139af5321d25192e675cc276460d7ab6fcffe9 (diff) | |
download | gcc-6f207d5810934c0156cda61a12a56ff1915adb79.zip gcc-6f207d5810934c0156cda61a12a56ff1915adb79.tar.gz gcc-6f207d5810934c0156cda61a12a56ff1915adb79.tar.bz2 |
re PR c++/79420 (ICE on invalid C++ code on x86_64-linux-gnu: in tsubst_copy, at cp/pt.c:14573)
PR c++/79420
PR c++/79463
* parser.c (cp_parser_postfix_dot_deref_expression): Avoid
clobbering if the postfix expression isn't an EXPR_P.
* g++.dg/cpp1y/pr79463.C: New.
* g++.dg/template/incomplete10.C: New.
* g++.dg/template/incomplete9.C: New.
From-SVN: r245440
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr79463.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/incomplete10.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/incomplete9.C | 11 |
6 files changed, 49 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d840c5..7b94d3b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2017-02-14 Marek Polacek <polacek@redhat.com> + + PR c++/79420 + PR c++/79463 + * parser.c (cp_parser_postfix_dot_deref_expression): Avoid + clobbering if the postfix expression isn't an EXPR_P. + 2017-02-13 Jason Merrill <jason@redhat.com> PR c++/79461 - ICE with lambda in constexpr constructor diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ce45bba..ccafefd 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7331,7 +7331,9 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, (scope, current_class_type)))) { scope = complete_type (scope); - if (!COMPLETE_TYPE_P (scope)) + if (!COMPLETE_TYPE_P (scope) + /* Avoid clobbering e.g. OVERLOADs or DECLs. */ + && EXPR_P (postfix_expression)) { /* In a template, be permissive by treating an object expression of incomplete type as dependent (after a pedwarn). */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 071f38f..be1ea5c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-02-14 Marek Polacek <polacek@redhat.com> + + PR c++/79420 + PR c++/79463 + * g++.dg/cpp1y/pr79463.C: New. + * g++.dg/template/incomplete10.C: New. + * g++.dg/template/incomplete9.C: New. + 2017-02-14 H.J. Lu <hongjiu.lu@intel.com> PR target/79498 diff --git a/gcc/testsuite/g++.dg/cpp1y/pr79463.C b/gcc/testsuite/g++.dg/cpp1y/pr79463.C new file mode 100644 index 0000000..fdf668b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr79463.C @@ -0,0 +1,7 @@ +// PR c++/79463 +// { dg-options "-g" } +// { dg-do compile { target c++14 } } + +struct A; +extern A a; // { dg-error "'a' has incomplete type" } +template < int > int f = a.x; diff --git a/gcc/testsuite/g++.dg/template/incomplete10.C b/gcc/testsuite/g++.dg/template/incomplete10.C new file mode 100644 index 0000000..f0b406d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete10.C @@ -0,0 +1,13 @@ +// PR c++/79420 + +struct S; +extern S s; // { dg-error "'s' has incomplete type" } +template<int> int f () +{ + return s.x; +} + +void g () +{ + f<0> (); +} diff --git a/gcc/testsuite/g++.dg/template/incomplete9.C b/gcc/testsuite/g++.dg/template/incomplete9.C new file mode 100644 index 0000000..9e03232 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete9.C @@ -0,0 +1,11 @@ +// PR c++/79420 + +template<int> int f () +{ + return f.x; // { dg-error "overloaded function with no contextual type information" } +} + +void g () +{ + f<0> (); +} |