aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-01-21 20:27:19 -0500
committerJason Merrill <jason@gcc.gnu.org>2013-01-21 20:27:19 -0500
commitdcdb8613c25cee5ec5841aca65ee6a20cc8d9a02 (patch)
treede71e13439e099b6066db7e2fbe61fcecf1d8a26 /gcc
parentd2ae47e5f67932ca321b4ea81a62579afabb4ecc (diff)
downloadgcc-dcdb8613c25cee5ec5841aca65ee6a20cc8d9a02.zip
gcc-dcdb8613c25cee5ec5841aca65ee6a20cc8d9a02.tar.gz
gcc-dcdb8613c25cee5ec5841aca65ee6a20cc8d9a02.tar.bz2
re PR c++/56059 (SIGSEGV on invalid C++11 code)
PR c++/56059 * tree.c (strip_typedefs_expr) [TREE_VEC]: Preserve non-default template args count. From-SVN: r195355
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/tree.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype48.C16
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6370f7f..162420b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/56059
+ * tree.c (strip_typedefs_expr) [TREE_VEC]: Preserve non-default
+ template args count.
+
2013-01-18 Jason Merrill <jason@redhat.com>
PR target/54908
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 2b108c1..d1f14fc 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1351,6 +1351,8 @@ strip_typedefs_expr (tree t)
r = copy_node (t);
for (i = 0; i < n; ++i)
TREE_VEC_ELT (r, i) = (*vec)[i];
+ SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT
+ (r, GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (t));
}
else
r = t;
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype48.C b/gcc/testsuite/g++.dg/cpp0x/decltype48.C
new file mode 100644
index 0000000..29ce815
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype48.C
@@ -0,0 +1,16 @@
+// PR c++/56059
+// { dg-options -std=c++11 }
+
+typedef int Int;
+template<typename T> struct baz { };
+template<typename T> T bar();
+
+template<typename T, typename ... U>
+baz<decltype(bar<Int>(bar<U>() ...))> // { dg-error "no match" }
+foo();
+
+int main()
+{
+ foo<int, int>(); // { dg-error "no match" }
+ return 0;
+}