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