diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-03-27 23:36:39 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-03-27 23:36:39 +0000 |
commit | 9807a2e0ddb1eafb8725dbf0247271a4a694037b (patch) | |
tree | 508fded4dc90e33dcb937073b2a4c483f9b2acab | |
parent | cbd739410be5ecd8161cab1caba54df8cf15b02d (diff) |
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
-rw-r--r-- | lib/Sema/SemaType.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/TreeTransform.h | 4 | ||||
-rw-r--r-- | 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<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, } if (!Quals.empty()) { Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); - TLB.push<QualifiedTypeLoc>(Result); + // BuildQualifiedType might not add qualifiers if they are invalid. + if (Result.hasLocalQualifiers()) + TLB.push<QualifiedTypeLoc>(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<typename T> +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<int*>(0); + f2<int>(0); // expected-error {{no matching function for call to 'f2'}} +} |