Check that the incoming type to a default precision qualifier statement is valid.
Fixes new WebGL conformance tests
shader-with-illegal-default-precision.frag.html and
shader-with-illegal-default-precision.vert.html per
http://www.khronos.org/bugzilla/show_bug.cgi?id=781 . Also ran WebGL
1.0.1 conformance tests; no regressions.
BUG=none
Review URL: https://codereview.appspot.com/7302043
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1958 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/SymbolTable.h b/src/compiler/SymbolTable.h
index a89499e..bb7f198 100644
--- a/src/compiler/SymbolTable.h
+++ b/src/compiler/SymbolTable.h
@@ -323,10 +323,16 @@
void dump(TInfoSink &infoSink) const;
void copyTable(const TSymbolTable& copyOf);
- void setDefaultPrecision( TBasicType type, TPrecision prec ){
- if( type != EbtFloat && type != EbtInt ) return; // Only set default precision for int/float
+ bool setDefaultPrecision( const TPublicType& type, TPrecision prec ){
+ if (IsSampler(type.type))
+ return true; // Skip sampler types for the time being
+ if (type.type != EbtFloat && type.type != EbtInt)
+ return false; // Only set default precision for int/float
+ if (type.size != 1 || type.matrix || type.array)
+ return false; // Not allowed to set for aggregate types
int indexOfLastElement = static_cast<int>(precisionStack.size()) - 1;
- precisionStack[indexOfLastElement][type] = prec; // Uses map operator [], overwrites the current value
+ precisionStack[indexOfLastElement][type.type] = prec; // Uses map operator [], overwrites the current value
+ return true;
}
// Searches down the precisionStack for a precision qualifier for the specified TBasicType
diff --git a/src/compiler/glslang.y b/src/compiler/glslang.y
index 7cd4977..95caa6c 100644
--- a/src/compiler/glslang.y
+++ b/src/compiler/glslang.y
@@ -991,7 +991,10 @@
$$ = $1.intermAggregate;
}
| PRECISION precision_qualifier type_specifier_no_prec SEMICOLON {
- context->symbolTable.setDefaultPrecision( $3.type, $2 );
+ if (!context->symbolTable.setDefaultPrecision( $3, $2 )) {
+ context->error($1.line, "illegal type argument for default precision qualifier", getBasicString($3.type));
+ context->recover();
+ }
$$ = 0;
}
;
diff --git a/src/compiler/glslang_tab.cpp b/src/compiler/glslang_tab.cpp
index 7c47ec3..65fc418 100644
--- a/src/compiler/glslang_tab.cpp
+++ b/src/compiler/glslang_tab.cpp
@@ -667,20 +667,20 @@
762, 773, 777, 778, 788, 798, 808, 821, 822, 832,
845, 849, 853, 857, 858, 871, 872, 885, 886, 899,
900, 917, 918, 931, 932, 933, 934, 935, 939, 942,
- 953, 961, 988, 993, 1000, 1038, 1041, 1048, 1056, 1077,
- 1098, 1109, 1138, 1143, 1153, 1158, 1168, 1171, 1174, 1177,
- 1183, 1190, 1193, 1215, 1233, 1257, 1280, 1284, 1302, 1310,
- 1342, 1362, 1451, 1460, 1483, 1486, 1492, 1500, 1508, 1516,
- 1526, 1533, 1536, 1539, 1545, 1548, 1563, 1567, 1571, 1575,
- 1584, 1589, 1594, 1599, 1604, 1609, 1614, 1619, 1624, 1629,
- 1635, 1641, 1647, 1652, 1657, 1666, 1675, 1680, 1693, 1693,
- 1707, 1707, 1716, 1719, 1734, 1770, 1774, 1780, 1788, 1804,
- 1808, 1812, 1813, 1819, 1820, 1821, 1822, 1823, 1827, 1828,
- 1828, 1828, 1838, 1839, 1843, 1843, 1844, 1844, 1849, 1852,
- 1862, 1865, 1871, 1872, 1876, 1884, 1888, 1898, 1903, 1920,
- 1920, 1925, 1925, 1932, 1932, 1940, 1943, 1949, 1952, 1958,
- 1962, 1969, 1976, 1983, 1990, 2001, 2010, 2014, 2021, 2024,
- 2030, 2030
+ 953, 961, 988, 993, 1003, 1041, 1044, 1051, 1059, 1080,
+ 1101, 1112, 1141, 1146, 1156, 1161, 1171, 1174, 1177, 1180,
+ 1186, 1193, 1196, 1218, 1236, 1260, 1283, 1287, 1305, 1313,
+ 1345, 1365, 1454, 1463, 1486, 1489, 1495, 1503, 1511, 1519,
+ 1529, 1536, 1539, 1542, 1548, 1551, 1566, 1570, 1574, 1578,
+ 1587, 1592, 1597, 1602, 1607, 1612, 1617, 1622, 1627, 1632,
+ 1638, 1644, 1650, 1655, 1660, 1669, 1678, 1683, 1696, 1696,
+ 1710, 1710, 1719, 1722, 1737, 1773, 1777, 1783, 1791, 1807,
+ 1811, 1815, 1816, 1822, 1823, 1824, 1825, 1826, 1830, 1831,
+ 1831, 1831, 1841, 1842, 1846, 1846, 1847, 1847, 1852, 1855,
+ 1865, 1868, 1874, 1875, 1879, 1887, 1891, 1901, 1906, 1923,
+ 1923, 1928, 1928, 1935, 1935, 1943, 1946, 1952, 1955, 1961,
+ 1965, 1972, 1979, 1986, 1993, 2004, 2013, 2017, 2024, 2027,
+ 2033, 2033
};
#endif
@@ -3088,7 +3088,10 @@
case 73:
{
- context->symbolTable.setDefaultPrecision( (yyvsp[(3) - (4)].interm.type).type, (yyvsp[(2) - (4)].interm.precision) );
+ if (!context->symbolTable.setDefaultPrecision( (yyvsp[(3) - (4)].interm.type), (yyvsp[(2) - (4)].interm.precision) )) {
+ context->error((yyvsp[(1) - (4)].lex).line, "illegal type argument for default precision qualifier", getBasicString((yyvsp[(3) - (4)].interm.type).type));
+ context->recover();
+ }
(yyval.interm.intermNode) = 0;
}
break;