From 5cc344d8ce09a6d35ff88b9ea9f351062d779081 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Thu, 5 May 2016 13:36:55 -0600 Subject: [PATCH] Front-End: precise: capture noContraction on output parameter declarations. --- Test/baseResults/specExamples.vert.out | 8 ++++---- glslang/MachineIndependent/ParseHelper.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Test/baseResults/specExamples.vert.out b/Test/baseResults/specExamples.vert.out index 7de02d3..7a88033 100644 --- a/Test/baseResults/specExamples.vert.out +++ b/Test/baseResults/specExamples.vert.out @@ -83,10 +83,10 @@ ERROR: node is still EOpNull! 0:153 Function Parameters: 0:153 'i' (in float) 0:153 'j' (in float) -0:153 'k' (out float) +0:153 'k' (noContraction out float) 0:155 Sequence 0:155 move second child to first child (temp float) -0:155 'k' (out float) +0:155 'k' (noContraction out float) 0:155 add (temp float) 0:155 component-wise multiply (temp float) 0:155 'i' (in float) @@ -367,10 +367,10 @@ ERROR: node is still EOpNull! 0:153 Function Parameters: 0:153 'i' (in float) 0:153 'j' (in float) -0:153 'k' (out float) +0:153 'k' (noContraction out float) 0:155 Sequence 0:155 move second child to first child (temp float) -0:155 'k' (out float) +0:155 'k' (noContraction out float) 0:155 add (temp float) 0:155 component-wise multiply (temp float) 0:155 'i' (in float) diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 3373d2f..b9d77f2 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -3538,6 +3538,7 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali type.getQualifier().writeonly = qualifier.writeonly; type.getQualifier().restrict = qualifier.restrict; } + if (qualifier.isAuxiliary() || qualifier.isInterpolation()) error(loc, "cannot use auxiliary or interpolation qualifiers on a function parameter", "", ""); @@ -3545,8 +3546,12 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali error(loc, "cannot use layout qualifiers on a function parameter", "", ""); if (qualifier.invariant) error(loc, "cannot use invariant qualifier on a function parameter", "", ""); - if (qualifier.noContraction && qualifier.storage != EvqOut && qualifier.storage != EvqInOut) - warn(loc, "qualifier has no effect on non-output parameters", "precise", ""); + if (qualifier.noContraction) { + if (qualifier.storage == EvqOut || qualifier.storage == EvqInOut) + type.getQualifier().noContraction = true; + else + warn(loc, "qualifier has no effect on non-output parameters", "precise", ""); + } paramCheckFix(loc, qualifier.storage, type); } -- 2.7.4