diff options
author | Malcolm Parsons <malcolm.parsons@gmail.com> | 2016-10-21 21:13:56 +0000 |
---|---|---|
committer | Malcolm Parsons <malcolm.parsons@gmail.com> | 2016-10-21 21:13:56 +0000 |
commit | 57c09c8e23ec30c61d31fbb89f97c27413c3e8fe (patch) | |
tree | 1f341355f3b7684916e1b203733f6cec3e53ca94 /clang/lib/Sema/DeclSpec.cpp | |
parent | 8659d16631fdd1ff519a25d6867ddd9dbda8aea9 (diff) | |
download | llvm-57c09c8e23ec30c61d31fbb89f97c27413c3e8fe.zip llvm-57c09c8e23ec30c61d31fbb89f97c27413c3e8fe.tar.gz llvm-57c09c8e23ec30c61d31fbb89f97c27413c3e8fe.tar.bz2 |
[Sema] Store a SourceRange for multi-token builtin types
Summary:
clang-tidy's modernize-use-auto check uses the SourceRange of a
TypeLoc when replacing the type with auto.
This was producing the wrong result for multi-token builtin types
like long long:
-long long *ll = new long long();
+auto long *ll = new long long();
Reviewers: alexfh, hokein, rsmith, Prazek, aaron.ballman
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D25363
llvm-svn: 284885
Diffstat (limited to 'clang/lib/Sema/DeclSpec.cpp')
-rw-r--r-- | clang/lib/Sema/DeclSpec.cpp | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index 42d4633..d2bc7e6 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -610,14 +610,16 @@ bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy) { - // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that + // Overwrite TSWRange.Begin only if TypeSpecWidth was unspecified, so that // for 'long long' we will keep the source location of the first 'long'. if (TypeSpecWidth == TSW_unspecified) - TSWLoc = Loc; + TSWRange.setBegin(Loc); // Allow turning long -> long long. else if (W != TSW_longlong || TypeSpecWidth != TSW_long) return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID); TypeSpecWidth = W; + // Remember location of the last 'long' + TSWRange.setEnd(Loc); return false; } @@ -997,9 +999,9 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { TypeQualifiers)) { const unsigned NumLocs = 9; SourceLocation ExtraLocs[NumLocs] = { - TSWLoc, TSCLoc, TSSLoc, AltiVecLoc, - TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc, TQ_unalignedLoc - }; + TSWRange.getBegin(), TSCLoc, TSSLoc, + AltiVecLoc, TQ_constLoc, TQ_restrictLoc, + TQ_volatileLoc, TQ_atomicLoc, TQ_unalignedLoc}; FixItHint Hints[NumLocs]; SourceLocation FirstLoc; for (unsigned I = 0; I != NumLocs; ++I) { @@ -1041,8 +1043,8 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { // Only 'short' and 'long long' are valid with vector bool. (PIM 2.1) if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short) && (TypeSpecWidth != TSW_longlong)) - S.Diag(TSWLoc, diag::err_invalid_vector_bool_decl_spec) - << getSpecifierName((TSW)TypeSpecWidth); + S.Diag(TSWRange.getBegin(), diag::err_invalid_vector_bool_decl_spec) + << getSpecifierName((TSW)TypeSpecWidth); // vector bool long long requires VSX support or ZVector. if ((TypeSpecWidth == TSW_longlong) && @@ -1059,7 +1061,8 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { // vector long double and vector long long double are never allowed. // vector double is OK for Power7 and later, and ZVector. if (TypeSpecWidth == TSW_long || TypeSpecWidth == TSW_longlong) - S.Diag(TSWLoc, diag::err_invalid_vector_long_double_decl_spec); + S.Diag(TSWRange.getBegin(), + diag::err_invalid_vector_long_double_decl_spec); else if (!S.Context.getTargetInfo().hasFeature("vsx") && !S.getLangOpts().ZVector) S.Diag(TSTLoc, diag::err_invalid_vector_double_decl_spec); @@ -1070,10 +1073,11 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { } else if (TypeSpecWidth == TSW_long) { // vector long is unsupported for ZVector and deprecated for AltiVec. if (S.getLangOpts().ZVector) - S.Diag(TSWLoc, diag::err_invalid_vector_long_decl_spec); + S.Diag(TSWRange.getBegin(), diag::err_invalid_vector_long_decl_spec); else - S.Diag(TSWLoc, diag::warn_vector_long_decl_spec_combination) - << getSpecifierName((TST)TypeSpecType, Policy); + S.Diag(TSWRange.getBegin(), + diag::warn_vector_long_decl_spec_combination) + << getSpecifierName((TST)TypeSpecType, Policy); } if (TypeAltiVecPixel) { @@ -1106,8 +1110,8 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { if (TypeSpecType == TST_unspecified) TypeSpecType = TST_int; // short -> short int, long long -> long long int. else if (TypeSpecType != TST_int) { - S.Diag(TSWLoc, diag::err_invalid_width_spec) << (int)TypeSpecWidth - << getSpecifierName((TST)TypeSpecType, Policy); + S.Diag(TSWRange.getBegin(), diag::err_invalid_width_spec) + << (int)TypeSpecWidth << getSpecifierName((TST)TypeSpecType, Policy); TypeSpecType = TST_int; TypeSpecOwned = false; } @@ -1116,8 +1120,8 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { if (TypeSpecType == TST_unspecified) TypeSpecType = TST_int; // long -> long int. else if (TypeSpecType != TST_int && TypeSpecType != TST_double) { - S.Diag(TSWLoc, diag::err_invalid_width_spec) << (int)TypeSpecWidth - << getSpecifierName((TST)TypeSpecType, Policy); + S.Diag(TSWRange.getBegin(), diag::err_invalid_width_spec) + << (int)TypeSpecWidth << getSpecifierName((TST)TypeSpecType, Policy); TypeSpecType = TST_int; TypeSpecOwned = false; } |