annotate gcc/testsuite/gcc.dg/uninit-A.c @ 145:1830386684a0

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