r200496 - PR14995: Allow a dependent type as the second parameter of operator++ and
Richard Smith
richard-llvm at metafoo.co.uk
Thu Jan 30 14:24:05 PST 2014
Author: rsmith
Date: Thu Jan 30 16:24:05 2014
New Revision: 200496
URL: http://llvm.org/viewvc/llvm-project?rev=200496&view=rev
Log:
PR14995: Allow a dependent type as the second parameter of operator++ and
operator--, since it might instantiate as 'int' (or, if it's a pack, it
might instantiate as an empty pack).
Modified:
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/test/SemaCXX/overloaded-operator.cpp
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=200496&r1=200495&r2=200496&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Jan 30 16:24:05 2014
@@ -10909,11 +10909,10 @@ bool Sema::CheckOverloadedOperatorDeclar
// increment operator ++ for objects of that type.
if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
ParmVarDecl *LastParam = FnDecl->getParamDecl(FnDecl->getNumParams() - 1);
- bool ParamIsInt = false;
- if (const BuiltinType *BT = LastParam->getType()->getAs<BuiltinType>())
- ParamIsInt = BT->getKind() == BuiltinType::Int;
+ QualType ParamType = LastParam->getType();
- if (!ParamIsInt)
+ if (!ParamType->isSpecificBuiltinType(BuiltinType::Int) &&
+ !ParamType->isDependentType())
return Diag(LastParam->getLocation(),
diag::err_operator_overload_post_incdec_must_be_int)
<< LastParam->getType() << (Op == OO_MinusMinus);
Modified: cfe/trunk/test/SemaCXX/overloaded-operator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/overloaded-operator.cpp?rev=200496&r1=200495&r2=200496&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/overloaded-operator.cpp (original)
+++ cfe/trunk/test/SemaCXX/overloaded-operator.cpp Thu Jan 30 16:24:05 2014
@@ -452,3 +452,58 @@ namespace PR7681 {
Result = 1; // expected-error {{no viable overloaded '='}} // expected-note {{type 'PointerUnion<int *, float *>' is incomplete}}
}
}
+
+namespace PR14995 {
+ struct B {};
+ template<typename ...T> void operator++(B, T...) {}
+
+ void f() {
+ B b;
+ b++; // ok
+ ++b; // ok
+ }
+
+ template<typename... T>
+ struct C {
+ void operator-- (T...) {}
+ };
+
+ void g() {
+ C<int> postfix;
+ C<> prefix;
+ postfix--; // ok
+ --prefix; // ok
+ }
+
+ struct D {};
+ template<typename T> void operator++(D, T) {}
+
+ void h() {
+ D d;
+ d++; // ok
+ ++d; // expected-error{{cannot increment value of type 'PR14995::D'}}
+ }
+
+ template<typename...T> struct E {
+ void operator++(T...) {} // expected-error{{parameter of overloaded post-increment operator must have type 'int' (not 'char')}}
+ };
+
+ E<char> e; // expected-note {{in instantiation of template class 'PR14995::E<char>' requested here}}
+
+ struct F {
+ template<typename... T>
+ int operator++ (T...) {}
+ };
+
+ int k1 = F().operator++(0, 0);
+ int k2 = F().operator++('0');
+ // expected-error at -5 {{overloaded 'operator++' must be a unary or binary operator}}
+ // expected-note at -3 {{in instantiation of function template specialization 'PR14995::F::operator++<int, int>' requested here}}
+ // expected-error at -4 {{no matching member function for call to 'operator++'}}
+ // expected-note at -8 {{candidate template ignored: substitution failure}}
+ // expected-error at -9 {{parameter of overloaded post-increment operator must have type 'int' (not 'char')}}
+ // expected-note at -6 {{in instantiation of function template specialization 'PR14995::F::operator++<char>' requested here}}
+ // expected-error at -7 {{no matching member function for call to 'operator++'}}
+ // expected-note at -12 {{candidate template ignored: substitution failure}}
+} // namespace PR14995
+
More information about the cfe-commits
mailing list