* Expression representing the index we want to access inside the
* container.
*/
- public CCodeExpression index { get; set; }
+ public List<CCodeExpression> indices { get; set; }
public CCodeElementAccess (CCodeExpression cont, CCodeExpression i) {
container = cont;
- index = i;
+ indices = new ArrayList<CCodeExpression> ();
+ indices.add (i);
+ }
+
+ public CCodeElementAccess.with_indices (CCodeExpression cont, List<CCodeExpression> i) {
+ container = cont;
+ indices = i;
}
public override void write (CCodeWriter writer) {
container.write_inner (writer);
writer.write_string ("[");
- index.write (writer);
+ bool first = true;
+ foreach (var index in indices) {
+ if (!first) {
+ writer.write_string ("][");
+ }
+ index.write (writer);
+ first = false;
+ }
writer.write_string ("]");
}
}
} else {
Report.error (expr.source_reference, "internal error: only integer literals supported as index");
}
+ } else if (expr.container.symbol_reference is Constant && rank > 1) {
+ // access to element in a multi-dimensional array constant
+ var cindices = new ArrayList<CCodeExpression> ();
+ cindices.add (cindex);
+ for (int i = 1; i < rank; i++) {
+ cindices.add (get_cvalue (indices[i]));
+ }
+ set_cvalue (expr, new CCodeElementAccess.with_indices (ccontainer, cindices));
} else {
// access to element in an array
for (int i = 1; i < rank; i++) {
return is_pure_ccode_expression (cma.inner);
} else if (cexpr is CCodeElementAccess) {
var cea = (CCodeElementAccess) cexpr;
- return is_pure_ccode_expression (cea.container) && is_pure_ccode_expression (cea.index);
+ return is_pure_ccode_expression (cea.container) && is_pure_ccode_expression (cea.indices[0]);
} else if (cexpr is CCodeCastExpression) {
var ccast = (CCodeCastExpression) cexpr;
return is_pure_ccode_expression (ccast.inner);
constants/glog.vala \
arrays/cast-silent-invalid.test \
arrays/class-field-length-cname.vala \
+ arrays/constant-element-access.vala \
arrays/expression-bracket.test \
arrays/fixed-length-init0-not-allowed.vala \
arrays/field-global-length-cname.vala \
--- /dev/null
+const string[,] FOO = {
+ { "00", "01", "02" },
+ { "10", "11", "12" },
+ { "20", "21", "22" }
+};
+
+void main () {
+ const string[,] BAR = {
+ { "00", "01", "02" },
+ { "10", "11", "12" },
+ { "20", "21", "22" }
+ };
+
+ for (int i = 0; i < FOO.length[0]; i++) {
+ assert (FOO[i,0] == "%d%d".printf (i, 0));
+ assert (FOO[i,1] == "%d%d".printf (i, 1));
+ assert (FOO[i,2] == "%d%d".printf (i, 2));
+ }
+
+ for (int i = 0; i < BAR.length[0]; i++) {
+ assert (BAR[i,0] == "%d%d".printf (i, 0));
+ assert (BAR[i,1] == "%d%d".printf (i, 1));
+ assert (BAR[i,2] == "%d%d".printf (i, 2));
+ }
+
+ assert (FOO[0,0] == "%d%d".printf (0, 0));
+ assert (FOO[1,1] == "%d%d".printf (1, 1));
+ assert (FOO[2,2] == "%d%d".printf (2, 2));
+
+ assert (BAR[0,0] == "%d%d".printf (0, 0));
+ assert (BAR[1,1] == "%d%d".printf (1, 1));
+ assert (BAR[2,2] == "%d%d".printf (2, 2));
+}