summaryrefslogtreecommitdiffstats
path: root/tests/diagnostics/param-mutation.slang
blob: 723c4c212eac8f6fcf66076a9ffb0b866df4b6ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// param-mutation.slang

// When a parameter is passed to `in`, it is mutable but generates a warning as it probably (?)
// isn't what the programmer intended.

//DIAGNOSTIC_TEST:SIMPLE:

struct MutatingStruct
{
    [mutating] void setValue(int value) { m_value = value; }
    int m_value;
};

int doThing(MutatingStruct s, int v)
{
    // Should generate a warning. 
    s.setValue(v + 1);
    return s.m_value;
}

// For non-copyable types (such as HitObject or NonCopyableStruct declared below), if passed as as `in`
// should produce an error.

[__NonCopyableType]
struct NonCopyableStruct
{
    [mutating] void setValue(int value) { m_value = value; }
    int m_value;
};

int doThing2(NonCopyableStruct s, int v)
{
    s.setValue(v + 1);
    return s.m_value;
}