119 lines
2.8 KiB
Diff
119 lines
2.8 KiB
Diff
Upstream-Status: Inappropriate [Backport]
|
|
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
|
|
|