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 | deec07403cb88b6e72b8a25fff5e6f4b8d0705dd (patch) | |
| tree | e34edb1d0622ab8143a65c3c9f0a8facea17d10a | |
| parent | 55ab0c5438bd7e71fd7ad214659a3189824754c8 (diff) | |
| download | bcm5719-llvm-deec07403cb88b6e72b8a25fff5e6f4b8d0705dd.tar.gz bcm5719-llvm-deec07403cb88b6e72b8a25fff5e6f4b8d0705dd.zip | |
Don't reject __restrict applied to a dependent type; it might instantiate to a pointer or reference type.
llvm-svn: 178198
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 4 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/fun-template-def.cpp | 8 |
3 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index e9ccbecaba5..95df969ebaa 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/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/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1dde87d2e6d..1e424b6076b 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/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/clang/test/SemaTemplate/fun-template-def.cpp b/clang/test/SemaTemplate/fun-template-def.cpp index 04277812187..f57a045649a 100644 --- a/clang/test/SemaTemplate/fun-template-def.cpp +++ b/clang/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'}} +} |

