aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/unions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/unions.cpp')
-rw-r--r--test/Analysis/unions.cpp50
1 files changed, 0 insertions, 50 deletions
diff --git a/test/Analysis/unions.cpp b/test/Analysis/unions.cpp
deleted file mode 100644
index e7671a90b9..0000000000
--- a/test/Analysis/unions.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core %s -verify
-
-namespace PR14054_reduced {
- struct Definition;
- struct ParseNode {
- union {
- Definition *lexdef;
- ParseNode *data;
- } pn_u;
- };
- struct Definition : public ParseNode { };
-
- void CloneParseTree(ParseNode *opn, ParseNode *pn, ParseNode *x) {
- // This used to cause an assertion failure because:
- // 1. The implicit operator= for unions assigns all members of the union,
- // not just the active one (b/c there's no way to know which is active).
- // 2. RegionStore dutifully stored all the variants at the same offset;
- // the last one won.
- // 3. We asked for the value of the first variant but got back a conjured
- // symbol for the second variant.
- // 4. We ended up trying to add a base cast to a region of the wrong type.
- //
- // Now (at the time this test was added), we instead treat all variants of
- // a union as different offsets, but only allow one to be active at a time.
- *pn = *opn;
- x = pn->pn_u.lexdef->pn_u.lexdef;
- }
-}
-
-namespace PR14054_original {
- struct Definition;
- struct ParseNode {
- union {
- struct {
- union {};
- Definition *lexdef;
- } name;
- class {
- int *target;
- ParseNode *data;
- } xmlpi;
- } pn_u;
- };
- struct Definition : public ParseNode { };
-
- void CloneParseTree(ParseNode *opn, ParseNode *pn, ParseNode *x) {
- pn->pn_u = opn->pn_u;
- x = pn->pn_u.name.lexdef->pn_u.name.lexdef;
- }
-}