1

The following code when compiled give this error I cannot understand why this is happening. each line of the switch statement has this error. This code was taken from a code which was compiling perfectly with g++ but I don't understand what is the problem with gcc.

void 
str_murmurhash3_x64_128 ( const void * key, const int len,
                           const uint32_t seed, void * out )
{
    const uint8_t * data = (const uint8_t*)key;
    const int nblocks = len / 16;

    uint64_t h1 = seed;
    uint64_t h2 = seed;

    uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5);
    uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f);

    //----------
    // body

    const uint64_t * blocks = (const uint64_t *)(data);
    int i;
    for(i = 0; i < nblocks; i++)
    {
        uint64_t k1 = getblock(blocks,i*2+0);
        uint64_t k2 = getblock(blocks,i*2+1);

        k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;

        h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;

        k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;

        h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;
    }

    //----------
    // tail

    const uint8_t * tail = (const uint8_t*)(data + nblocks*16);

    uint64_t k1 = 0;
    uint64_t k2 = 0;

    switch(len & 15)
    {
        case 15: k2 ^= uint64_t(tail[14]) << 48;
        case 14: k2 ^= uint64_t(tail[13]) << 40;
        case 13: k2 ^= uint64_t(tail[12]) << 32;
        case 12: k2 ^= uint64_t(tail[11]) << 24;
        case 11: k2 ^= uint64_t(tail[10]) << 16;
        case 10: k2 ^= uint64_t(tail[ 9]) << 8;
        case  9: k2 ^= uint64_t(tail[ 8]) << 0;
                k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;

        case  8: k1 ^= uint64_t(tail[ 7]) << 56;
        case  7: k1 ^= uint64_t(tail[ 6]) << 48;
        case  6: k1 ^= uint64_t(tail[ 5]) << 40;
        case  5: k1 ^= uint64_t(tail[ 4]) << 32;
        case  4: k1 ^= uint64_t(tail[ 3]) << 24;
        case  3: k1 ^= uint64_t(tail[ 2]) << 16;
        case  2: k1 ^= uint64_t(tail[ 1]) << 8;
        case  1: k1 ^= uint64_t(tail[ 0]) << 0;
                k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
    };

    //----------
    // finalization

    h1 ^= len; h2 ^= len;

    h1 += h2;
    h2 += h1;

    h1 = fmix(h1);
    h2 = fmix(h2);

    h1 += h2;
    h2 += h1;

    ((uint64_t*)out)[0] = h1;
    ((uint64_t*)out)[1] = h2;
}

The following is th error and all line number specified in error corresponds to lines inside switch case.

murmurhash3.c:103:18: error: expected expression before ‘uint64_t’
murmurhash3.c:104:18: error: expected expression before ‘uint64_t’
murmurhash3.c:105:18: error: expected expression before ‘uint64_t’
murmurhash3.c:106:18: error: expected expression before ‘uint64_t’
murmurhash3.c:107:18: error: expected expression before ‘uint64_t’
murmurhash3.c:108:18: error: expected expression before ‘uint64_t’
murmurhash3.c:109:18: error: expected expression before ‘uint64_t’
murmurhash3.c:112:18: error: expected expression before ‘uint64_t’
murmurhash3.c:113:18: error: expected expression before ‘uint64_t’
murmurhash3.c:114:18: error: expected expression before ‘uint64_t’
murmurhash3.c:115:18: error: expected expression before ‘uint64_t’
murmurhash3.c:116:18: error: expected expression before ‘uint64_t’
murmurhash3.c:117:18: error: expected expression before ‘uint64_t’
murmurhash3.c:118:18: error: expected expression before ‘uint64_t’
murmurhash3.c:119:18: error: expected expression before ‘uint64_t’

Any help is appreciated.

0

2 Answers 2

3

You have a syntax error:

case 15: k2 ^= uint64_t(tail[14]) << 48;

Try instead this:

case 15: k2 ^= ((uint64_t)tail[14]) << 48;

Also, do you want the fall-through behavior? If not, do add break; after each case statement.

Sign up to request clarification or add additional context in comments.

7 Comments

but now th ecompiler is giving waring murmurhash3.c:104:45: warning: value computed is not used [-Wunused-value] . Why is this warning coming??
Are you sure? I compiled with -std=c99 -Wall -pedantic without issues.
I never said I compiled with c99 rather it was g++
@AmanDeepGautam: Your question is tagged as gcc and c. What should that mean then? (BTW: The following snippet compiles equally well in C and C++ mode #include <stdint.h> with -Wall -pedantic.) int main() { unsigned int k = 2, l = 3; switch ( k ) { case 1: k ^= (uint8_t)l << 1; } }.
I did not tag g++ because I did not think that it would make sense because I am compiling with gcc now. "It compiles with g++" is just a piece of information I provided so that it is easy for all to believe that there is no other mistake anywhere else and the sole reson is compiler change
|
0

As far as I understand, you have used uint64_t to typecast unsigned 64 bit integer, so try (uint64_t)tail[14], instead of uint64_t(tail[14])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.