1 module contract.constexpr;
2 
3 
4 import contract;
5 
6 
7 @("static constexpr variable in struct")
8 @safe unittest {
9 
10     import clang: Token;
11 
12     const tu = parse(
13         Cpp(
14             q{
15                 struct Struct {
16                     static constexpr int constExprValue = 42;
17                     static const int constValue = 33;
18                     static int value;
19                 };
20             }
21         )
22     );
23 
24     tu.children.length.shouldEqual(1);
25 
26     const struct_ = tu.children[0];
27     printChildren(struct_);
28 
29     struct_.kind.shouldEqual(Cursor.Kind.StructDecl);
30     struct_.children.length.shouldEqual(3);
31 
32     const constexprVar = struct_.children[0]; printChildren(constexprVar);
33     const constVar     = struct_.children[1]; printChildren(constVar);
34     const var          = struct_.children[2]; printChildren(var);
35 
36     constexprVar.kind.shouldEqual(Cursor.Kind.VarDecl);
37     constexprVar.type.kind.shouldEqual(Type.Kind.Int);
38     constexprVar.type.spelling.shouldEqual("const int");
39     constexprVar.type.isConstQualified.shouldBeTrue;
40     Token(Token.Kind.Keyword, "constexpr").should.be in constexprVar.tokens;
41     constexprVar.tokens[$-1].spelling.should == "42";
42 
43     constVar.kind.shouldEqual(Cursor.Kind.VarDecl);
44     constVar.type.kind.shouldEqual(Type.Kind.Int);
45     constVar.type.spelling.shouldEqual("const int");
46     constVar.type.isConstQualified.shouldBeTrue;
47     Token(Token.Kind.Keyword, "constexpr").should.not.be in constVar.tokens;
48     constVar.tokens[$-1].spelling.should == "33";
49 
50     var.kind.shouldEqual(Cursor.Kind.VarDecl);
51     var.type.kind.shouldEqual(Type.Kind.Int);
52     var.type.spelling.shouldEqual("int");
53     var.type.isConstQualified.shouldBeFalse;
54     Token(Token.Kind.Keyword, "constexpr").should.not.be in var.tokens;
55 
56 }