summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch117
1 files changed, 117 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch
new file mode 100644
index 0000000..15136bf
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0026-decl2.c-cp_check_const_attributes-New.patch
@@ -0,0 +1,117 @@
+From 87e73453e8135e72f592c1d7c84da942e7a1e308 Mon Sep 17 00:00:00 2001
+From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 29 Mar 2011 14:24:59 +0000
+Subject: [PATCH 026/200] * decl2.c (cp_check_const_attributes): New.
+ (cplus_decl_attributes): Call cp_check_const_attributes.
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@171667 138bc75d-0d04-0410-961f-82ee72b054a4
+
+index eb5d4f5..f62f913 100644
+--- a/gcc/cp/decl2.c
++++ b/gcc/cp/decl2.c
+@@ -1264,6 +1264,25 @@ cp_reconstruct_complex_type (tree type, tree bottom)
+ return cp_build_qualified_type (outer, cp_type_quals (type));
+ }
+
++/* Replaces any constexpr expression that may be into the attributes
++ arguments with their reduced value. */
++
++static void
++cp_check_const_attributes (tree attributes)
++{
++ tree attr;
++ for (attr = attributes; attr; attr = TREE_CHAIN (attr))
++ {
++ tree arg;
++ for (arg = TREE_VALUE (attr); arg; arg = TREE_CHAIN (arg))
++ {
++ tree expr = TREE_VALUE (arg);
++ if (EXPR_P (expr))
++ TREE_VALUE (arg) = maybe_constant_value (expr);
++ }
++ }
++}
++
+ /* Like decl_attributes, but handle C++ complexity. */
+
+ void
+@@ -1284,6 +1303,8 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
+ return;
+ }
+
++ cp_check_const_attributes (attributes);
++
+ if (TREE_CODE (*decl) == TEMPLATE_DECL)
+ decl = &DECL_TEMPLATE_RESULT (*decl);
+
+new file mode 100644
+index 0000000..ac85c07
+--- /dev/null
++++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C
+@@ -0,0 +1,63 @@
++// { dg-options -std=c++0x }
++
++//A few constexpr's
++constexpr int foo() { return __alignof__(int); }
++
++template<typename T>
++constexpr int fooT() { return __alignof__(T); }
++
++template<int N>
++constexpr int fooN() { return N; }
++
++//Now the attributes
++
++//with normal variables,
++int a __attribute__((aligned(foo())));
++int b __attribute__((aligned(fooT<int>())));
++int c __attribute__((aligned(fooN<__alignof__(int)>())));
++
++//with variables inside a template,
++template <typename T>
++void fun()
++{
++ T a __attribute__((aligned(foo())));
++ T b __attribute__((aligned(fooT<T>())));
++ T c __attribute__((aligned(fooN<__alignof__(T)>())));
++ T d __attribute__((aligned(fooT<int>())));
++ T e __attribute__((aligned(fooN<__alignof__(int)>())));
++}
++
++//instantiate it,
++void bar()
++{
++ fun<int>();
++}
++
++//with classes
++struct __attribute__((aligned(foo()))) S0
++{
++ char dummy;
++};
++S0 s0;
++
++struct __attribute__((aligned(fooT<int>()))) S1
++{
++ char dummy;
++};
++S1 s1;
++
++//and class templates
++template <typename T>
++struct __attribute__((aligned(foo()))) S2
++{
++ char dummy;
++};
++
++S2<int> s2;
++
++template <typename T>
++struct __attribute__((aligned(fooT<T>()))) S3
++{
++ char dummy;
++};
++S3<int> s3;
+--
+1.7.0.4
+
OpenPOWER on IntegriCloud