diff --git a/src/front/glsl/parser/declarations.rs b/src/front/glsl/parser/declarations.rs index 346d20b19e..bdcb4a2b80 100644 --- a/src/front/glsl/parser/declarations.rs +++ b/src/front/glsl/parser/declarations.rs @@ -68,8 +68,35 @@ impl<'source> ParsingContext<'source> { // initializer_list let mut components = Vec::new(); loop { - // TODO: Change type - components.push(self.parse_initializer(parser, ty, ctx, body)?.0); + // The type expected to be parsed inside the initializer list + let new_ty = match parser.module.types[ty].inner { + TypeInner::Vector { kind, width, .. } => parser.module.types.insert( + Type { + name: None, + inner: TypeInner::Scalar { kind, width }, + }, + Default::default(), + ), + TypeInner::Matrix { rows, width, .. } => parser.module.types.insert( + Type { + name: None, + inner: TypeInner::Vector { + size: rows, + kind: ScalarKind::Float, + width, + }, + }, + Default::default(), + ), + TypeInner::Array { base, .. } => base, + TypeInner::Struct { ref members, .. } => members + .get(components.len()) + .map(|member| member.ty) + .unwrap_or(ty), + _ => ty, + }; + + components.push(self.parse_initializer(parser, new_ty, ctx, body)?.0); let token = self.bump(parser)?; match token.value {