Consider this test case:
1 template <const char *const C, typename T>
2 struct A
3 {};
4
5 struct B {};
6
7 extern constexpr char HELLO_WORLD[] = "hello world";
8
9 A<HELLO_WORLD, B> g; // <-- This works fine
10
11 template <typename T>
12 using PartiallySpecialized = A<HELLO_WORLD, T>; // <-- This fails
13
At line 12 G++ fails to instantiate the alias template that has a
string variable initialized with a string literal, with the error
message:
test.cc:12:46: error: ‘"hello world"’ is not a valid template argument of type ‘const char*’ because ‘"hello world"’ is not a variable
using PartiallySpecialized = A<HELLO_WORLD, T>; // <-- This fails
^
Note that instantiating the template A at line 9 with the same
arguments as in the problematic case above works.
This happens in the context of lookup_template_class_1, when it handles
the alias template instantiation A<HELLO_WORLD, T> and thus passes the
VAR_DECL for HELLO_WORLD to convert_nontype_argument.
Note that from there decay_conversion replaces the the VAR_DECL with
its STRING_CST initializer[1]. Latter on, convert_nontype_argument
checks that the HELLO_WORLD constant it received as argument was
indeed a VAR_DECL:
else
{
tree decl;
decl = ((TREE_CODE (expr) == ADDR_EXPR)
? TREE_OPERAND (expr, 0) : expr);
if (TREE_CODE (decl) != VAR_DECL)
{
error ("%qE is not a valid template argument of type %qT "
"because %qE is not a variable",
expr, type, decl);
return NULL_TREE;
}
But the issue is, that VAR_DECL has been replaced by STRING_CST, so
the last 'if' above fails.
The fix is to teach decay_conversion to return the address of array,
rather than returning its initializer.
Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.
gcc/cp/
PR c++/55311
* pt.c (decay_conversion): Do not return the initializer of an array.
gcc/testsuite/
PR c++/55311
* g++.dg/cpp0x/alias-decl-30.C: New test.
* g++.dg/init/array21.C: New test.
From-SVN: r194961
| Name |
Last commit
|
Last update |
|---|---|---|
| INSTALL | Loading commit data... | |
| boehm-gc | Loading commit data... | |
| config | Loading commit data... | |
| contrib | Loading commit data... | |
| fixincludes | Loading commit data... | |
| gcc | Loading commit data... | |
| gnattools | Loading commit data... | |
| include | Loading commit data... | |
| intl | Loading commit data... | |
| libada | Loading commit data... | |
| libatomic | Loading commit data... | |
| libbacktrace | Loading commit data... | |
| libcpp | Loading commit data... | |
| libdecnumber | Loading commit data... | |
| libffi | Loading commit data... | |
| libgcc | Loading commit data... | |
| libgfortran | Loading commit data... | |
| libgo | Loading commit data... | |
| libgomp | Loading commit data... | |
| libiberty | Loading commit data... | |
| libitm | Loading commit data... | |
| libjava | Loading commit data... | |
| libmudflap | Loading commit data... | |
| libobjc | Loading commit data... | |
| libquadmath | Loading commit data... | |
| libsanitizer | Loading commit data... | |
| libssp | Loading commit data... | |
| libstdc++-v3 | Loading commit data... | |
| lto-plugin | Loading commit data... | |
| maintainer-scripts | Loading commit data... | |
| zlib | Loading commit data... | |
| ABOUT-NLS | Loading commit data... | |
| COPYING | Loading commit data... | |
| COPYING.LIB | Loading commit data... | |
| COPYING.RUNTIME | Loading commit data... | |
| COPYING3 | Loading commit data... | |
| COPYING3.LIB | Loading commit data... | |
| ChangeLog | Loading commit data... | |
| ChangeLog.tree-ssa | Loading commit data... | |
| MAINTAINERS | Loading commit data... | |
| Makefile.def | Loading commit data... | |
| Makefile.in | Loading commit data... | |
| Makefile.tpl | Loading commit data... | |
| README | Loading commit data... | |
| compile | Loading commit data... | |
| config-ml.in | Loading commit data... | |
| config.guess | Loading commit data... | |
| config.rpath | Loading commit data... | |
| config.sub | Loading commit data... | |
| configure | Loading commit data... | |
| configure.ac | Loading commit data... | |
| depcomp | Loading commit data... | |
| install-sh | Loading commit data... | |
| libtool-ldflags | Loading commit data... | |
| libtool.m4 | Loading commit data... | |
| ltgcc.m4 | Loading commit data... | |
| ltmain.sh | Loading commit data... | |
| ltoptions.m4 | Loading commit data... | |
| ltsugar.m4 | Loading commit data... | |
| ltversion.m4 | Loading commit data... | |
| lt~obsolete.m4 | Loading commit data... | |
| missing | Loading commit data... | |
| mkdep | Loading commit data... | |
| mkinstalldirs | Loading commit data... | |
| move-if-change | Loading commit data... | |
| symlink-tree | Loading commit data... | |
| ylwrap | Loading commit data... |