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 }