]> granicus.if.org Git - clang/commitdiff
Fixed source location info for UnaryTransformTypeLoc nodes.
authorEnea Zaffanella <zaffanella@cs.unipr.it>
Sat, 6 Jul 2013 18:54:58 +0000 (18:54 +0000)
committerEnea Zaffanella <zaffanella@cs.unipr.it>
Sat, 6 Jul 2013 18:54:58 +0000 (18:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185765 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/ASTMatchers/ASTMatchers.h
lib/Parse/ParseDeclCXX.cpp
unittests/AST/SourceLocationTest.cpp

index d6c19b7dfa2a51f7b8c72042ea232c36dd39f1db..110638a278d79fccd5f9027f26b86d6ac844770a 100644 (file)
@@ -3186,6 +3186,16 @@ AST_TYPE_MATCHER(TypedefType, typedefType);
 /// instantiation in \c A and the type of the variable declaration in \c B.
 AST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType);
 
+/// \brief Matches types nodes representing unary type transformations.
+///
+/// Given:
+/// \code
+///   typedef __underlying_type(T) type;
+/// \endcode
+/// unaryTransformType()
+///   matches "__underlying_type(T)"
+AST_TYPE_MATCHER(UnaryTransformType, unaryTransformType);
+
 /// \brief Matches record types (e.g. structs, classes).
 ///
 /// Given
index 67f9c3c7a7c348ec09b81dbbf5fecb61021003ec..070c9a0120db6077f695ab2707bba3534f973bbb 100644 (file)
@@ -827,6 +827,7 @@ void Parser::ParseUnderlyingTypeSpecifier(DeclSpec &DS) {
   if (DS.SetTypeSpecType(DeclSpec::TST_underlyingType, StartLoc, PrevSpec,
                          DiagID, Result.release()))
     Diag(StartLoc, DiagID) << PrevSpec;
+  DS.setTypeofParensRange(T.getRange());
 }
 
 /// ParseBaseTypeSpecifier - Parse a C++ base-type-specifier which is either a
index 669fcd48a47fca6acad4410fb48e7ac9018c2fc7..be63085b8a5e64a9742d35393c6cedf6a7f89155 100644 (file)
@@ -180,5 +180,26 @@ TEST(CXXNewExpr, TypeParenRange) {
   EXPECT_TRUE(Verifier.match("int* a = new (int);", newExpr()));
 }
 
+class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
+protected:
+  virtual SourceRange getRange(const TypeLoc &Node) {
+    UnaryTransformTypeLoc T =
+        Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
+    assert(!T.isNull());
+    return SourceRange(T.getLParenLoc(), T.getRParenLoc());
+  }
+};
+
+TEST(UnaryTransformTypeLoc, ParensRange) {
+  UnaryTransformTypeLocParensRangeVerifier Verifier;
+  Verifier.expectRange(3, 26, 3, 28);
+  EXPECT_TRUE(Verifier.match(
+      "template <typename T>\n"
+      "struct S {\n"
+      "typedef __underlying_type(T) type;\n"
+      "};",
+      loc(unaryTransformType())));
+}
+
 } // end namespace ast_matchers
 } // end namespace clang