From 2f782d403ae5729b6c93fbe92577ee01f7a8d608 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Fri, 20 Apr 2018 16:56:33 -0700 Subject: Diagnose use of an implicit cast as an argument for an `out` parameter (#516) Work on #499 Two big fixes here: * The logic for checking constraints on `out` arguments wasn't actually triggering because it relied on function parameters being given an `OutType` if they are marked `out`, but the code wasn't actually doing that. Fixing the computation of types for functions resolved that issue. * Next, I added a specific diagnostic to follow up the "expected an l-value" error to let the user know that their argument was implicitly converted, and that is why it doesn't count as an l-value in Slang's rules. I've added a test case to ensure that we retain this diagnostic until we can do a true fix for the issue. The right long-term fix is to have an AST representation of all the implicit casts involved (e.g., in both directions for an `inout` parameter), and then have the IR generate explicit code for the conversions in each direction (the `LoweredVal` representation can handle this sort of thing). --- source/slang/syntax.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'source/slang/syntax.cpp') diff --git a/source/slang/syntax.cpp b/source/slang/syntax.cpp index 9d29e7d21..5e855de29 100644 --- a/source/slang/syntax.cpp +++ b/source/slang/syntax.cpp @@ -2081,9 +2081,22 @@ void Type::accept(IValVisitor* visitor, void* extra) funcType->setSession(session); funcType->resultType = GetResultType(declRef); - for (auto pp : GetParameters(declRef)) + for (auto paramDeclRef : GetParameters(declRef)) { - funcType->paramTypes.Add(GetType(pp)); + auto paramDecl = paramDeclRef.getDecl(); + auto paramType = GetType(paramDeclRef); + if( paramDecl->FindModifier() ) + { + if(paramDecl->FindModifier() || paramDecl->FindModifier()) + { + paramType = session->getInOutType(paramType); + } + else + { + paramType = session->getOutType(paramType); + } + } + funcType->paramTypes.Add(paramType); } return funcType; -- cgit v1.2.3