@@ -314,7 +314,11 @@ bool Version::isValidEffectiveLanguageVersion() const {
314
314
for (auto verStr : getValidEffectiveVersions ()) {
315
315
auto v = parseVersionString (verStr, SourceLoc (), nullptr );
316
316
assert (v.hasValue ());
317
- if (v == *this )
317
+ // In this case, use logical-equality _and_ precision-equality. We do not
318
+ // want to permit users requesting effective language versions more precise
319
+ // than our whitelist (eg. we permit 3 but not 3.0 or 3.0.0), since
320
+ // accepting such an argument promises more than we're able to deliver.
321
+ if (v == *this && v.getValue ().size () == size ())
318
322
return true ;
319
323
}
320
324
return false ;
@@ -336,23 +340,27 @@ bool operator>=(const class Version &lhs,
336
340
if (lhs.empty ())
337
341
return true ;
338
342
339
- auto n = std::min (lhs.size (), rhs.size ());
343
+ auto n = std::max (lhs.size (), rhs.size ());
340
344
341
345
for (size_t i = 0 ; i < n; ++i) {
342
- if (lhs[i] < rhs[i])
346
+ auto lv = i < lhs.size () ? lhs[i] : 0 ;
347
+ auto rv = i < rhs.size () ? rhs[i] : 0 ;
348
+ if (lv < rv)
343
349
return false ;
344
- else if (lhs[i] > rhs[i] )
350
+ else if (lv > rv )
345
351
return true ;
346
352
}
347
- return lhs.size () >= rhs.size ();
353
+ // Equality
354
+ return true ;
348
355
}
349
356
350
357
bool operator ==(const class Version &lhs,
351
358
const class Version &rhs) {
352
- if (lhs.size () != rhs.size ())
353
- return false ;
354
- for (size_t i = 0 ; i < lhs.size (); ++i) {
355
- if (lhs[i] != rhs[i])
359
+ auto n = std::max (lhs.size (), rhs.size ());
360
+ for (size_t i = 0 ; i < n; ++i) {
361
+ auto lv = i < lhs.size () ? lhs[i] : 0 ;
362
+ auto rv = i < rhs.size () ? rhs[i] : 0 ;
363
+ if (lv != rv)
356
364
return false ;
357
365
}
358
366
return true ;
0 commit comments