OSDN Git Service

2006-05-20 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / uninit-A.c
1 /* Inspired by part of java/parse.y.
2    May be a real bug in CSE. */
3
4 /* { dg-do compile } */
5 /* { dg-options "-O2 -Wall" } */
6
7 struct tree
8 {
9     struct tree *car, *cdr, *wfl;
10     int code;
11     struct { unsigned int renp:1;
12       unsigned int rtnp:1;
13       unsigned int rpnp:1; } flags;
14 };
15 typedef struct tree *tree;
16 #define NULL_TREE ((tree)0)
17
18 /* Codes */
19 enum
20 {
21     CALL_EXPR, NEW_ARRAY_EXPR, NEW_CLASS_EXPR, CONVERT_EXPR,
22     ARRAY_REF, CONDITIONAL_EXPR, STRING_CST, EXPR_WITH_FILE_LOCATION
23 };
24
25 /* Flags */
26 #define RESOLVE_EXPRESSION_NAME_P(t) ((t)->flags.renp)
27 #define RESOLVE_TYPE_NAME_P(t) ((t)->flags.rtnp)
28 #define RESOLVE_PACKAGE_NAME_P(t) ((t)->flags.rpnp)
29
30 /* Macros */
31 #define EXPR_WFL_QUALIFICATION(t) ((t)->wfl)
32 #define QUAL_WFL(t) ((t)->wfl)
33 #define EXPR_WFL_NODE(t) ((t)->wfl)
34 #define TREE_CODE(t) ((t)->code)
35 #define TREE_OPERAND(t,x) ((t)->car)
36 #define CLASSTYPE_SUPER(t) ((t)->car)
37 #define IDENTIFIER_LOCAL_VALUE(t) ((t)->car)
38 #define TREE_CHAIN(t) ((t)->cdr)
39 #define QUAL_RESOLUTION(t) ((t)->cdr)
40
41 extern tree current_class, this_identifier_node;
42 extern tree super_identifier_node, length_identifier_node;
43
44 tree resolve_and_layout (tree, tree);
45 tree lookup_field_wrapper (tree, tree);
46
47 void
48 qualify_ambiguous_name (id)
49      tree id;
50 {
51   tree qual, qual_wfl, decl;
52   tree name;     /* { dg-bogus "name" "uninitialized variable warning" } */
53   tree ptr_type; /* { dg-bogus "ptr_type" "uninitialized variable warning" } */
54   int again, new_array_found = 0;
55   int super_found = 0, this_found = 0;
56
57   qual = EXPR_WFL_QUALIFICATION (id);
58   do {
59     qual_wfl = QUAL_WFL (qual);
60     switch (TREE_CODE (qual_wfl))
61       {
62       case CALL_EXPR:
63         qual_wfl = TREE_OPERAND (qual_wfl, 0);
64         if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION)
65           {
66             qual = EXPR_WFL_QUALIFICATION (qual_wfl);
67             qual_wfl = QUAL_WFL (qual);
68           }
69         break;
70       case NEW_ARRAY_EXPR:
71         qual = TREE_CHAIN (qual);
72         new_array_found = again = 1;
73         continue;
74       case NEW_CLASS_EXPR:
75       case CONVERT_EXPR:
76         qual_wfl = TREE_OPERAND (qual_wfl, 0);
77         break;
78       case ARRAY_REF:
79         while (TREE_CODE (qual_wfl) == ARRAY_REF)
80           qual_wfl = TREE_OPERAND (qual_wfl, 0);
81         break;
82       default:
83         break;
84       }
85
86     name = EXPR_WFL_NODE (qual_wfl);
87     ptr_type = current_class;
88     again = 0;
89
90   } while (again);
91
92   /* If you put straightforward uses of name and ptr_type here
93      instead of the if-else sequence below, the warnings go away.
94      Therefore I suspect a real bug. */
95   
96   if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name)))
97     {
98       RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
99       QUAL_RESOLUTION (qual) = decl;
100     }
101   else if ((decl = lookup_field_wrapper (ptr_type, name))
102            || (new_array_found && name == length_identifier_node))
103     {
104       RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
105       QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
106     }
107   else if ((decl = resolve_and_layout (name, NULL_TREE)))
108     {
109       RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
110       QUAL_RESOLUTION (qual) = decl;
111     }
112   else if (TREE_CODE (QUAL_WFL (qual)) == CALL_EXPR
113            || TREE_CODE (QUAL_WFL (qual)) == ARRAY_REF)
114     RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
115   else 
116     RESOLVE_PACKAGE_NAME_P (qual_wfl) = 1;
117 }