Bug 24664 - Template instantiation generating an array of voids doesn't fail
Summary: Template instantiation generating an array of voids doesn't fail
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.1.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: accepts-invalid, monitored
Depends on:
Blocks: 24666
  Show dependency treegraph
 
Reported: 2005-11-04 02:30 UTC by Joshua Conner
Modified: 2021-08-02 03:18 UTC (History)
5 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail: 2.95.3, 3.0.4, 3.2.3, 3.4.0, 4.0.0
Last reconfirmed: 2021-08-01 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Joshua Conner 2005-11-04 02:30:11 UTC
The following code, pulled from an example in section 14.8.2.2 of ISO C++, should fail to compile, but doesn't:

  template<class T> int f(T[5]);
  int j=f<void>(0);

A function template instantiation should fail if it would create an array with void elements.
Comment 1 Andrew Pinski 2005-11-04 04:41:23 UTC
Confirmed.
Comment 2 Andrew Stubbs 2007-05-24 15:27:46 UTC
You can create an array of functions. Also prohibited by clause 14.8.2/2.

template <class T> int f(T[5]);
typedef void (fn)();
int K = f<fn>(0);

At least it doesn't seem to accept reference types ...
Comment 3 Patrick Palka 2016-01-19 00:19:49 UTC
Author: ppalka
Date: Tue Jan 19 00:19:16 2016
New Revision: 232547

URL: https://gcc.gnu.org/viewcvs?rev=232547&root=gcc&view=rev
Log:
Fix the remaining PR c++/24666 blockers (arrays decay to pointers too early)

gcc/cp/ChangeLog:

	PR c++/11858
	PR c++/24663
	PR c++/24664
	* decl.c (grokdeclarator): Don't decay array parameter type to
	a pointer type if it's dependent.
	(grokparms): Invoke strip_top_quals instead of directly invoking
	cp_build_qualified_type.
	* pt.c (decay_dependent_array_parm_type): New static function.
	(type_unification_real): Call decay_dependent_array_parm_type
	to decay a dependent array parameter type to its corresponding
	pointer type before unification.
	(more_specialized_fn): Likewise.
	(get_bindings): Likewise.
	* tree.c (cp_build_qualified_type): Trivial typofix in
	documentation.

gcc/testsuite/ChangeLog:

	PR c++/11858
	PR c++/24663
	PR c++/24664
	* g++.dg/template/pr11858.C: New test.
	* g++.dg/template/pr24663.C: New test.
	* g++.dg/template/unify12.C: New test.
	* g++.dg/template/unify13.C: New test.
	* g++.dg/template/unify14.C: New test.
	* g++.dg/template/unify15.C: New test.
	* g++.dg/template/unify16.C: New test.
	* g++.dg/template/unify17.C: New test.


Added:
    trunk/gcc/testsuite/g++.dg/template/pr11858.C
    trunk/gcc/testsuite/g++.dg/template/pr24663.C
    trunk/gcc/testsuite/g++.dg/template/unify12.C
    trunk/gcc/testsuite/g++.dg/template/unify13.C
    trunk/gcc/testsuite/g++.dg/template/unify14.C
    trunk/gcc/testsuite/g++.dg/template/unify15.C
    trunk/gcc/testsuite/g++.dg/template/unify16.C
    trunk/gcc/testsuite/g++.dg/template/unify17.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/decl.c
    trunk/gcc/cp/pt.c
    trunk/gcc/cp/tree.c
    trunk/gcc/testsuite/ChangeLog
Comment 4 Patrick Palka 2016-01-19 16:08:48 UTC
Fixed for GCC 6.
Comment 5 Patrick Palka 2016-01-24 17:45:53 UTC
Author: ppalka
Date: Sun Jan 24 17:45:21 2016
New Revision: 232778

URL: https://gcc.gnu.org/viewcvs?rev=232778&root=gcc&view=rev
Log:
Revert "Fix the remaining PR c++/24666 blockers"

gcc/cp/ChangeLog:

	Revert:
	2016-01-18  Patrick Palka  <ppalka@gcc.gnu.org>

	PR c++/11858
	PR c++/24663
	PR c++/24664
	* decl.c (grokdeclarator): Don't decay array parameter type to
	a pointer type if it's dependent.
	(grokparms): Invoke strip_top_quals instead of directly invoking
	cp_build_qualified_type.
	* pt.c (decay_dependent_array_parm_type): New static function.
	(type_unification_real): Call decay_dependent_array_parm_type
	to decay a dependent array parameter type to its corresponding
	pointer type before unification.
	(more_specialized_fn): Likewise.
	(get_bindings): Likewise.
	* tree.c (cp_build_qualified_type): Trivial typofix in
	documentation.

gcc/testsuite/ChangeLog:

	Revert:
	2016-01-18  Patrick Palka  <ppalka@gcc.gnu.org>

	PR c++/11858
	PR c++/24663
	PR c++/24664
	* g++.dg/template/pr11858.C: New test.
	* g++.dg/template/pr24663.C: New test.
	* g++.dg/template/unify12.C: New test.
	* g++.dg/template/unify13.C: New test.
	* g++.dg/template/unify14.C: New test.
	* g++.dg/template/unify15.C: New test.
	* g++.dg/template/unify16.C: New test.
	* g++.dg/template/unify17.C: New test.


Removed:
    trunk/gcc/testsuite/g++.dg/template/pr11858.C
    trunk/gcc/testsuite/g++.dg/template/pr24663.C
    trunk/gcc/testsuite/g++.dg/template/unify12.C
    trunk/gcc/testsuite/g++.dg/template/unify13.C
    trunk/gcc/testsuite/g++.dg/template/unify14.C
    trunk/gcc/testsuite/g++.dg/template/unify15.C
    trunk/gcc/testsuite/g++.dg/template/unify16.C
    trunk/gcc/testsuite/g++.dg/template/unify17.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/decl.c
    trunk/gcc/cp/pt.c
    trunk/gcc/cp/tree.c
    trunk/gcc/testsuite/ChangeLog
Comment 6 Patrick Palka 2016-01-24 17:49:40 UTC
Patch reverted due to numerous issues mentioned in the following thread:

https://gcc.gnu.org/ml/gcc-patches/2016-01/msg01463.html