]> granicus.if.org Git - clang/commitdiff
When formatting a C++-only declaration name, enable C++ mode in the formatter's
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 22 Jan 2014 00:27:42 +0000 (00:27 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 22 Jan 2014 00:27:42 +0000 (00:27 +0000)
language options. This is not really ideal -- we should require the right
language options to be passed in, or not require language options to format a
name -- but it fixes a number of *obviously* wrong formattings. Patch by
Olivier Goffart!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199778 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclarationName.cpp
test/CXX/class.access/p4.cpp
test/CXX/class.access/p6.cpp
test/CXX/special/class.dtor/p10-0x.cpp
test/Index/load-classes.cpp
test/SemaCXX/undefined-internal.cpp
unittests/AST/DeclPrinterTest.cpp

index 56b757460082c4ffbc41a1cd34d665d87d07bf6d..e5019ab8d9ff0d4f608dde480848e16c9fa273ba 100644 (file)
@@ -150,7 +150,9 @@ raw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
     QualType ClassType = N.getCXXNameType();
     if (const RecordType *ClassRec = ClassType->getAs<RecordType>())
       return OS << *ClassRec->getDecl();
-    return OS << ClassType.getAsString();
+    LangOptions LO;
+    LO.CPlusPlus = true;
+    return OS << ClassType.getAsString(PrintingPolicy(LO));
   }
 
   case DeclarationName::CXXDestructorName: {
@@ -158,7 +160,9 @@ raw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
     QualType Type = N.getCXXNameType();
     if (const RecordType *Rec = Type->getAs<RecordType>())
       return OS << *Rec->getDecl();
-    return OS << Type.getAsString();
+    LangOptions LO;
+    LO.CPlusPlus = true;
+    return OS << Type.getAsString(PrintingPolicy(LO));
   }
 
   case DeclarationName::CXXOperatorName: {
@@ -185,7 +189,9 @@ raw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
     QualType Type = N.getCXXNameType();
     if (const RecordType *Rec = Type->getAs<RecordType>())
       return OS << *Rec->getDecl();
-    return OS << Type.getAsString();
+    LangOptions LO;
+    LO.CPlusPlus = true;
+    return OS << Type.getAsString(PrintingPolicy(LO));
   }
   case DeclarationName::CXXUsingDirective:
     return OS << "<using-directive>";
@@ -538,7 +544,9 @@ void DeclarationNameInfo::printName(raw_ostream &OS) const {
         OS << '~';
       else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName)
         OS << "operator ";
-      OS << TInfo->getType().getAsString();
+      LangOptions LO;
+      LO.CPlusPlus = true;
+      OS << TInfo->getType().getAsString(PrintingPolicy(LO));
     } else
       OS << Name;
     return;
index 0564a52b6d0d9204239fabcbb700c69f6a677408..435b09920df631c8d492b27c76fca9faaca0fc3f 100644 (file)
@@ -79,8 +79,8 @@ namespace test1 {
     -ca;
     // These are all surrogate calls
     ca(pub);
-    ca(prot); // expected-error {{'operator void (*)(class Protected &)' is a protected member}}
-    ca(priv); // expected-error {{'operator void (*)(class Private &)' is a private member}}
+    ca(prot); // expected-error {{'operator void (*)(Protected &)' is a protected member}}
+    ca(priv); // expected-error {{'operator void (*)(Private &)' is a private member}}
   }
 }
 
index 5007263a355b666ce98ce01c67f362aaebab6046..f9b95f0851ef39bb5d03e01af7c3227f9aa84031 100644 (file)
@@ -177,7 +177,7 @@ namespace test8 {
   };
 
   void test(A &a) {
-    if (a) return; // expected-error-re {{'operator void *(class test8::A::*)(void){{( __attribute__\(\(thiscall\)\))?}} const' is a private member of 'test8::A'}}
+    if (a) return; // expected-error-re {{'operator void *(test8::A::*)(){{( __attribute__\(\(thiscall\)\))?}} const' is a private member of 'test8::A'}}
   }
 }
 
index e10afb52e2b4bc866781322233c7b756ad947f4c..029cbd6cebb5c983cba5c89357da883f8edd8a08 100644 (file)
@@ -7,7 +7,7 @@ template<typename T>
 void b(const T *x, const A *y) {
   x->~decltype(T())();
   x->~decltype(*x)(); // expected-error{{the type of object expression ('const int') does not match the type being destroyed ('decltype(*x)' (aka 'const int &')) in pseudo-destructor expression}} \
-                         expected-error{{no member named '~const struct A &' in 'A'}}
+                         expected-error{{no member named '~const A &' in 'A'}}
   x->~decltype(int())(); // expected-error{{no member named '~int' in 'A'}}
 
   y->~decltype(*y)(); // expected-error{{destructor type 'decltype(*y)' (aka 'const A &') in object destruction expression does not match the type 'const A' of the object being destroyed}}
index db7b48f7efce11b69aa5e46e68e46c9611eb4368..9790d9e6f41de7df832b5f62b3946067c93e7491 100644 (file)
@@ -23,7 +23,7 @@ X::X(int value) {
 // CHECK: load-classes.cpp:5:11: TypeRef=struct X:3:8 Extent=[5:11 - 5:12]
 // CHECK: load-classes.cpp:7:3: CXXDestructor=~X:7:3 Extent=[7:3 - 7:7] [access=protected]
 // FIXME: missing TypeRef in the destructor name
-// CHECK: load-classes.cpp:9:3: CXXConversion=operator struct X *:9:3 Extent=[9:3 - 9:16] [access=private]
+// CHECK: load-classes.cpp:9:3: CXXConversion=operator X *:9:3 Extent=[9:3 - 9:16] [access=private]
 // CHECK: load-classes.cpp:9:12: TypeRef=struct X:3:8 Extent=[9:12 - 9:13]
 // CHECK: load-classes.cpp:12:4: CXXConstructor=X:12:4 (Definition) Extent=[12:1 - 13:2] [access=public]
 // CHECK: load-classes.cpp:12:1: TypeRef=struct X:3:8 Extent=[12:1 - 12:2]
index fdfa43b98229b8f9f4694944675ec78edbf43c35..9d3048dc2e26a82c1e2b2b50f6eb6900e4f0ef26 100644 (file)
@@ -288,7 +288,7 @@ namespace test12 {
       virtual operator T3&() = 0;
       operator T4();  // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator T4' has internal linkage but is not defined}}
       operator T5();  // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator T5' has internal linkage but is not defined}}
-      operator T6&();  // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator class test12::T6 &' has internal linkage but is not defined}}
+      operator T6&();  // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator test12::T6 &' has internal linkage but is not defined}}
     };
 
     struct Cls2 {
index 33c51363e9d05127e8c929b55d916f56f5b859f4..ade55aaee363e2a0c62bf574ada8d2f83d94c639 100644 (file)
@@ -558,7 +558,7 @@ TEST(DeclPrinter, TestCXXConversionDecl3) {
     "  operator Z();"
     "};",
     methodDecl(ofClass(hasName("A"))).bind("id"),
-    "Z operator struct Z()"));
+    "Z operator Z()"));
     // WRONG; Should be: "operator Z();"
 }