diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2015-07-26 17:04:31 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2015-07-26 17:04:31 +0000 |
commit | 11f2c78ae877382e2c25313b520aaf9b4e111be6 (patch) | |
tree | 07d1909c8fdadd4a61a5000e8ed989ebebe54fa2 /gcc/testsuite | |
parent | af7186706c6cd7d5014f0637308c80d8f2cd2545 (diff) | |
download | gcc-11f2c78ae877382e2c25313b520aaf9b4e111be6.zip gcc-11f2c78ae877382e2c25313b520aaf9b4e111be6.tar.gz gcc-11f2c78ae877382e2c25313b520aaf9b4e111be6.tar.bz2 |
Fix PR c++/18969 (invalid return statement diagnosed too late)
gcc/cp/ChangeLog:
PR c++/18969
* typeck.c (check_return_expr): Also do the basic return-value
validity checking if processing_template_decl and yet types are
not dependent. Remove obsolete code.
gcc/testsuite/ChangeLog:
PR c++/18969
* g++.dg/template/pr18969.C: New test.
* g++.dg/template/pr18969-2.C: New test.
* g++.old-deja/g++.jason/overload.C: Remove return value in
template function returning void.
From-SVN: r226236
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr18969-2.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr18969.C | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.jason/overload.C | 2 |
4 files changed, 34 insertions, 1 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3ccbf5c..c711f83 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-07-26 Patrick Palka <ppalka@gcc.gnu.org> + + PR c++/18969 + * g++.dg/template/pr18969.C: New test. + * g++.dg/template/pr18969-2.C: New test. + * g++.old-deja/g++.jason/overload.C: Remove return value in + template function returning void. + 2015-07-26 Uros Bizjak <ubizjak@gmail.com> * gcc.target/alpha/pr66140.c (lpfc_bg_setup_bpl): Use unsigned diff --git a/gcc/testsuite/g++.dg/template/pr18969-2.C b/gcc/testsuite/g++.dg/template/pr18969-2.C new file mode 100644 index 0000000..e0b0c1b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr18969-2.C @@ -0,0 +1,11 @@ +// PR c++/18969 +// { dg-do compile { target c++14 } } + +template <typename T> +struct A +{ + auto *f1 () { return; } // { dg-error "return-statement" } + auto &f2 () { return; } // { dg-error "return-statement" } + + auto f3 () { return; } // { dg-bogus "return-statement" } +}; diff --git a/gcc/testsuite/g++.dg/template/pr18969.C b/gcc/testsuite/g++.dg/template/pr18969.C new file mode 100644 index 0000000..dba5eb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr18969.C @@ -0,0 +1,14 @@ +// PR c++/18969 + +template <typename T> +struct A +{ + int f1 () { return; } // { dg-error "return-statement" } + void f2 () { return 5; } // { dg-error "return-statement" } + T *f3 () { return; } // { dg-error "return-statement" } + typename T::f &f4 () { return; } // { dg-error "return-statement" } + + T f5 () { return; } // { dg-bogus "return-statement" } + void f6 () { return (T)true; } // { dg-bogus "return-statement" } + typename T::f f7 () { return; } // { dg-bogus "return-statement" } +}; diff --git a/gcc/testsuite/g++.old-deja/g++.jason/overload.C b/gcc/testsuite/g++.old-deja/g++.jason/overload.C index 6a747ff..28b029f 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/overload.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/overload.C @@ -5,7 +5,7 @@ enum bar {}; void operator+ (int, int);// { dg-error "" } .* void operator+ (bar&, int); -template <class T> void operator+ (int b, T& t) { return b; } +template <class T> void operator+ (int b, T& t) { return; } void operator+ (int, bar&); template <class T> class foo |