From 38ed9146fd25e38b068414416b7abd7d71a657b0 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Mon, 1 May 2023 16:26:37 +0100 Subject: [PATCH] D: parse contract expressions --- Units/parser-d.r/simple.d.d/expected.tags | 1 + Units/parser-d.r/simple.d.d/input.d | 4 ++++ parsers/c-based.c | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Units/parser-d.r/simple.d.d/expected.tags b/Units/parser-d.r/simple.d.d/expected.tags index 7e0eae6de6..a459a7a966 100644 --- a/Units/parser-d.r/simple.d.d/expected.tags +++ b/Units/parser-d.r/simple.d.d/expected.tags @@ -23,6 +23,7 @@ main input.d /^void main(string[] args)$/;" f file: member input.d /^ T member;$/;" m class:Class.CT file: modulevar input.d /^ int modulevar;$/;" m file: obj input.d /^Object obj;$/;" v +out_contract input.d /^T out_contract()$/;" f file: qar input.d /^ int qar;$/;" m union:Struct.Union file: quxx input.d /^ bool quxx;$/;" m union:Struct.Union file: test.simple input.d /^module test.simple;$/;" M diff --git a/Units/parser-d.r/simple.d.d/input.d b/Units/parser-d.r/simple.d.d/input.d index baa0eef396..fecb37ddbf 100644 --- a/Units/parser-d.r/simple.d.d/input.d +++ b/Units/parser-d.r/simple.d.d/input.d @@ -90,7 +90,11 @@ static assert( num < TL.length, "Name '"~name~"' is not found"); __gshared int globalVar; +T out_contract() +out(r; r > 0) {} do {} + void main(string[] args) +in(args.length > 0) { auto foo = new Class(1337); diff --git a/parsers/c-based.c b/parsers/c-based.c index 41f52b1703..e735385cd3 100644 --- a/parsers/c-based.c +++ b/parsers/c-based.c @@ -2072,7 +2072,13 @@ static bool skipPostArgumentStuff ( { case KEYWORD_ATTRIBUTE: skipParens (); break; case KEYWORD_THROW: skipParens (); break; - case KEYWORD_IF: if (isInputLanguage (Lang_d)) skipParens (); break; + case KEYWORD_IF: // D template constraint + // D contract expressions + case KEYWORD_IN: + case KEYWORD_OUT: + if (isInputLanguage (Lang_d)) + skipParens (); + break; case KEYWORD_TRY: break; case KEYWORD_CONST: