aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-08-23 12:03:01 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-08-23 12:03:01 -0400
commit2787914706395bf7864bdc76491ada1b0a552cae (patch)
treecea100638ebf6cc422229ffd053565b0691337bb /gcc
parent7a74aa7f4a5666e5b50c30d57b00845337d51906 (diff)
downloadgcc-2787914706395bf7864bdc76491ada1b0a552cae.zip
gcc-2787914706395bf7864bdc76491ada1b0a552cae.tar.gz
gcc-2787914706395bf7864bdc76491ada1b0a552cae.tar.bz2
re PR c++/50024 ([C++0x] [4.7 Regression] crash when using braced initialization in member function of template)
PR c++/50024 * semantics.c (maybe_constant_value): Don't try to fold { }. * pt.c (build_non_dependent_expr): Don't wrap { }. * init.c (build_value_init): Allow scalar value-init in templates. From-SVN: r177994
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/init.c2
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/cp/semantics.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C15
6 files changed, 33 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 524a685..0f60bcb 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,12 @@
2011-08-23 Jason Merrill <jason@redhat.com>
+ PR c++/50024
+ * semantics.c (maybe_constant_value): Don't try to fold { }.
+ * pt.c (build_non_dependent_expr): Don't wrap { }.
+ * init.c (build_value_init): Allow scalar value-init in templates.
+
+2011-08-23 Jason Merrill <jason@redhat.com>
+
* semantics.c (potential_constant_expression_1): Allow 'this'.
2011-08-23 Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 4fa627b..847f519 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -330,7 +330,7 @@ build_value_init (tree type, tsubst_flags_t complain)
constructor. */
/* The AGGR_INIT_EXPR tweaking below breaks in templates. */
- gcc_assert (!processing_template_decl);
+ gcc_assert (!processing_template_decl || SCALAR_TYPE_P (type));
if (CLASS_TYPE_P (type))
{
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index ed4fe72..3f9a4c0 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19669,6 +19669,10 @@ build_non_dependent_expr (tree expr)
if (TREE_CODE (expr) == THROW_EXPR)
return expr;
+ /* Don't wrap an initializer list, we need to be able to look inside. */
+ if (BRACE_ENCLOSED_INITIALIZER_P (expr))
+ return expr;
+
if (TREE_CODE (expr) == COND_EXPR)
return build3 (COND_EXPR,
TREE_TYPE (expr),
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 1f6b49a..2f62e35 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -7542,6 +7542,7 @@ maybe_constant_value (tree t)
if (type_dependent_expression_p (t)
|| type_unknown_p (t)
+ || BRACE_ENCLOSED_INITIALIZER_P (t)
|| !potential_constant_expression (t)
|| value_dependent_expression_p (t))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e3c521c..fe36888 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-23 Jason Merrill <jason@redhat.com>
+
+ PR c++/50024
+ * g++.dg/cpp0x/constexpr-initlist5.C: New.
+
2011-08-23 Jakub Jelinek <jakub@redhat.com>
PR c++/50158
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C
new file mode 100644
index 0000000..97f0399
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C
@@ -0,0 +1,15 @@
+// PR c++/50024
+// { dg-options -std=c++0x }
+
+template< class T >
+struct Container
+{
+ Container(){
+ int* ptr = new int{};
+ }
+};
+
+int main() {
+ Container< int > c;
+}
+