]> granicus.if.org Git - clang/commitdiff
Literal operators can't have default arguments.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 9 Mar 2012 08:16:22 +0000 (08:16 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 9 Mar 2012 08:16:22 +0000 (08:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152394 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaOverload.cpp
test/CXX/over/over.oper/over.literal/p3.cpp

index a5a597bdb99114b2429fda88859ca85475821668..fadcdf9d360ec0744a5baf5cd0ec1b54b0502363 100644 (file)
@@ -4758,6 +4758,8 @@ def err_operator_delete_param_type : Error<
 // C++ literal operators
 def err_literal_operator_outside_namespace : Error<
   "literal operator %0 must be in a namespace or global scope">;
+def err_literal_operator_default_argument : Error<
+  "literal operator cannot have a default argument">;
 // FIXME: This diagnostic sucks
 def err_literal_operator_params : Error<
   "parameter declaration for literal operator %0 is not valid">;
index 4d7310a146e723469fdd07e5fa0990517f11168a..32284968c9087131bd6c093bd705698623f90c48 100644 (file)
@@ -9389,6 +9389,19 @@ FinishedParams:
     return true;
   }
 
+  // A parameter-declaration-clause containing a default argument is not
+  // equivalent to any of the permitted forms.
+  for (FunctionDecl::param_iterator Param = FnDecl->param_begin(),
+                                    ParamEnd = FnDecl->param_end();
+       Param != ParamEnd; ++Param) {
+    if ((*Param)->hasDefaultArg()) {
+      Diag((*Param)->getDefaultArgRange().getBegin(),
+           diag::err_literal_operator_default_argument)
+        << (*Param)->getDefaultArgRange();
+      break;
+    }
+  }
+
   StringRef LiteralName
     = FnDecl->getDeclName().getCXXLiteralIdentifier()->getName();
   if (LiteralName[0] != '_') {
index e74e6d5e126651c1fc4526cc6e8e6b687287f42e..fac3b7f3839abfb58b98ca443a9e318b8557de30 100644 (file)
@@ -10911,13 +10911,6 @@ ExprResult Sema::BuildLiteralOperatorCall(LookupResult &R,
 
   bool HadMultipleCandidates = (CandidateSet.size() > 1);
 
-  // FIXME: Reject default arguments in literal operator definitions. We're not
-  // supposed to treat this as ambiguous:
-  //
-  //   int operator"" _x(const char *p);
-  //   int operator"" _x(const char *p, size_t n = 0);
-  //   int k = 123_x;
-
   // Perform overload resolution. This will usually be trivial, but might need
   // to perform substitutions for a literal operator template.
   OverloadCandidateSet::iterator Best;
index 0b5323b4731efa9f55a2768ed750b18158407cc6..674ace9aee192917e3b1146fc7986b8dd1e659dd 100644 (file)
@@ -37,3 +37,4 @@ char operator "" _a(volatile wchar_t *, size_t); // expected-error {{parameter}}
 char operator "" _a(char16_t *, size_t); // expected-error {{parameter}}
 char operator "" _a(const char32_t *, size_t, bool = false); // expected-error {{parameter}}
 char operator "" _a(const char *, signed long); // expected-error {{parameter}}
+char operator "" _a(const char *, size_t = 0); // expected-error {{default argument}}