OSDN Git Service

2012-01-27 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Jan 2012 10:54:51 +0000 (10:54 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Jan 2012 10:54:51 +0000 (10:54 +0000)
PR middle-end/51959
* expr.c (store_field): Use the alias-set of the scratch memory
for storing to it.

* g++.dg/torture/pr51959.C: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183616 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr51959.C [new file with mode: 0644]

index e7fb05d..a18f505 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-27  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/51959
+       * expr.c (store_field): Use the alias-set of the scratch memory
+       for storing to it.
+
 2012-01-27  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/51990
index 8698f18..48c3e0a 100644 (file)
@@ -6299,7 +6299,7 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
 
       store_field (blk_object, bitsize, bitpos,
                   bitregion_start, bitregion_end,
-                  mode, exp, type, alias_set, nontemporal);
+                  mode, exp, type, MEM_ALIAS_SET (blk_object), nontemporal);
 
       emit_move_insn (target, object);
 
index 58311bc..bdd2792 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-27  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/51959
+       * g++.dg/torture/pr51959.C: New testcase.
+
 2012-01-27  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/51990
diff --git a/gcc/testsuite/g++.dg/torture/pr51959.C b/gcc/testsuite/g++.dg/torture/pr51959.C
new file mode 100644 (file)
index 0000000..da0be71
--- /dev/null
@@ -0,0 +1,80 @@
+// { dg-do compile }
+
+namespace std {
+    typedef __SIZE_TYPE__ size_t;
+}
+inline void* operator new(std::size_t, void* __p) throw() {
+    return __p;
+}
+template <typename T> class QTypeInfo {
+};
+enum { Q_COMPLEX_TYPE = 0,     Q_PRIMITIVE_TYPE = 0x1,     Q_STATIC_TYPE = 0,     Q_MOVABLE_TYPE = 0x2,     Q_DUMMY_TYPE = 0x4 };
+template<typename Enum> class QFlags {
+    int i;
+    inline QFlags(Enum f) : i(f) { }
+};
+class __attribute__((visibility("default"))) QSize {
+public:
+    bool isEmpty() const;
+    friend inline bool operator==(const QSize &, const QSize &);
+    int wd;
+    int ht;
+};
+template<> class QTypeInfo<QSize > {
+public:
+    enum {
+       isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isLarge = (sizeof(QSize)>sizeof(void*)), isPointer = false, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0) };
+};
+class __attribute__((visibility("default"))) QBasicAtomicInt {
+public:
+    inline bool operator!=(int value) const     { }
+};
+struct __attribute__((visibility("default"))) QListData {
+    struct Data {
+       QBasicAtomicInt ref;
+    };
+    void **append();
+};
+template <typename T> class QList {
+    struct Node {
+       void *v;
+    };
+    union {
+       QListData p;
+       QListData::Data *d;
+    };
+public:
+    void append(const T &t);
+    inline void push_back(const T &t) {
+       append(t);
+    }
+    void node_construct(Node *n, const T &t);
+    void node_destruct(Node *n);
+};
+template <typename T> inline void QList<T>::node_construct(Node *n, const T &t) {
+    if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) n->v = new T(t);
+    else if (QTypeInfo<T>::isComplex) new (n) T(t);
+}
+template <typename T> inline void QList<T>::node_destruct(Node *n) {
+}
+template <typename T>  void QList<T>::append(const T &t) {
+    if (d->ref != 1) {
+       try {
+       }
+       catch (...) {
+       }
+       if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
+       }
+       else {
+           Node *n, copy;
+           node_construct(&copy, t);
+           try {                 n = reinterpret_cast<Node *>(p.append());;             }
+           catch (...) {                 node_destruct(&copy);                 throw;             }
+           *n = copy;
+       }
+    }
+};
+void virtual_hook(QSize sz, QList<QSize> &arg)
+{
+  arg.push_back(sz);
+}