Print this page
11506 smatch resync

@@ -163,11 +163,11 @@
 }
 
 struct expression *gen_expression_from_key(struct expression *arg, const char *key)
 {
         struct expression *ret;
-        struct token *token, *end;
+        struct token *token, *prev, *end;
         const char *p = key;
         char buf[4095];
         char *alloc;
         size_t len;
 

@@ -187,16 +187,19 @@
                 return NULL;
         token = token->next;
 
         ret = arg;
         while (token_type(token) == TOKEN_SPECIAL &&
-               token->special == SPECIAL_DEREFERENCE) {
+               (token->special == SPECIAL_DEREFERENCE || token->special == '.')) {
+                prev = token;
                 token = token->next;
                 if (token_type(token) != TOKEN_IDENT)
                         return NULL;
                 ret = deref_expression(ret);
-                ret = member_expression(ret, '*', token->ident);
+                ret = member_expression(ret,
+                                        (prev->special == SPECIAL_DEREFERENCE) ? '*' : '.',
+                                        token->ident);
                 token = token->next;
         }
 
         if (token_type(token) != TOKEN_STREAMEND)
                 return NULL;