From 9807a2e0ddb1eafb8725dbf0247271a4a694037b Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 27 Mar 2013 23:36:39 +0000 Subject: [PATCH] Don't reject __restrict applied to a dependent type; it might instantiate to a pointer or reference type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178198 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaType.cpp | 2 +- lib/Sema/TreeTransform.h | 4 +++- test/SemaTemplate/fun-template-def.cpp | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index e9ccbecaba..95df969eba 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1106,7 +1106,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { << EltTy << DS.getSourceRange(); TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier. } - } else { + } else if (!Result->isDependentType()) { S.Diag(DS.getRestrictSpecLoc(), diag::err_typecheck_invalid_restrict_not_pointer) << Result << DS.getSourceRange(); diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 1dde87d2e6..1e424b6076 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -3396,7 +3396,9 @@ TreeTransform::TransformQualifiedType(TypeLocBuilder &TLB, } if (!Quals.empty()) { Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); - TLB.push(Result); + // BuildQualifiedType might not add qualifiers if they are invalid. + if (Result.hasLocalQualifiers()) + TLB.push(Result); // No location information to preserve. } diff --git a/test/SemaTemplate/fun-template-def.cpp b/test/SemaTemplate/fun-template-def.cpp index 0427781218..f57a045649 100644 --- a/test/SemaTemplate/fun-template-def.cpp +++ b/test/SemaTemplate/fun-template-def.cpp @@ -46,3 +46,11 @@ T f1(T t1, U u1, int i1) return u1; } + +template +void f2(__restrict T x) {} // expected-note {{substitution failure [with T = int]: pointer to function type 'int' may not be 'restrict' qualified}} + +void f3() { + f2(0); + f2(0); // expected-error {{no matching function for call to 'f2'}} +} -- 2.40.0