diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp
index fdd33cf73aefafd2bddc83308ecae8c21ae66bc9..4ae27a4adc82f15f9be880091490dccddea76fa3 100644
--- a/lib/Sema/SemaLookup.cpp
+++ b/lib/Sema/SemaLookup.cpp
@@ -2536,7 +2536,7 @@ Sema::LookupLiteralOperator(Scope *S, LookupResult &R,
       if (FD->getNumParams() == 1 &&
           FD->getParamDecl(0)->getType()->getAs<PointerType>())
         IsRaw = true;
-      else {
+      else if (FD->getNumParams() == ArgTys.size()) {
         IsExactMatch = true;
         for (unsigned ArgIdx = 0; ArgIdx != ArgTys.size(); ++ArgIdx) {
           QualType ParamTy = FD->getParamDecl(ArgIdx)->getType();
diff --git a/test/SemaCXX/cxx11-user-defined-literals.cpp b/test/SemaCXX/cxx11-user-defined-literals.cpp
index 4bbecdb5b8e4a71916941c7815f998a94ac3c4d5..f8bbcd960fd32ba4671b6a004fdf52b182192cd7 100644
--- a/test/SemaCXX/cxx11-user-defined-literals.cpp
+++ b/test/SemaCXX/cxx11-user-defined-literals.cpp
@@ -135,3 +135,9 @@ namespace Namespace {
   int _y(unsigned long long);
   int k2 = 123_y; // expected-error {{no matching literal operator for call to 'operator "" _y'}}
 }
+
+namespace PR14950 {
+  template<...> // expected-error {{expected template parameter}}
+  int operator"" _b(); // expected-error {{no function template matches function template specialization}}
+  int main() { return 0_b; } // expected-error {{no matching literal operator for call to 'operator "" _b'}}
+}