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 }