[cfe-commits] r67268 - in /cfe/trunk: lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaTemplate.cpp lib/Sema/SemaType.cpp test/SemaCXX/qualified-names-diag.cpp test/SemaTemplate/qualified-names-diag.cpp
Douglas Gregor
dgregor at apple.com
Wed Mar 18 17:39:20 PDT 2009
Author: dgregor
Date: Wed Mar 18 19:39:20 2009
New Revision: 67268
URL: http://llvm.org/viewvc/llvm-project?rev=67268&view=rev
Log:
Extend the use of QualifiedNameType to the creation of class template
specialization names. This way, we keep track of sugared types like
std::vector<Real>
I believe we are now using QualifiedNameTypes everywhere we can. Next
step: QualifiedDeclRefExprs.
Added:
cfe/trunk/test/SemaTemplate/qualified-names-diag.cpp
Modified:
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Sema/SemaTemplate.cpp
cfe/trunk/lib/Sema/SemaType.cpp
cfe/trunk/test/SemaCXX/qualified-names-diag.cpp
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=67268&r1=67267&r2=67268&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Wed Mar 18 19:39:20 2009
@@ -295,6 +295,8 @@
SourceRange Range2 = SourceRange(),
QualType PrintType = QualType());
+ QualType getQualifiedNameType(const CXXScopeSpec &SS, QualType T);
+
//===--------------------------------------------------------------------===//
// Symbol table / Decl tracking callbacks: SemaDecl.cpp.
//
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=67268&r1=67267&r2=67268&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Mar 18 19:39:20 2009
@@ -87,13 +87,8 @@
} else
return 0;
- if (SS && SS->isNotEmpty() && SS->isSet()) {
- llvm::SmallVector<NestedNameSpecifier, 4> TNNs;
- for (CXXScopeSpec::iterator TNN = SS->begin(), TNNEnd = SS->end();
- TNN != TNNEnd; ++TNN)
- TNNs.push_back(NestedNameSpecifier::getFromOpaquePtr(*TNN));
- T = Context.getQualifiedNameType(&TNNs[0], TNNs.size(), T);
- }
+ if (SS)
+ T = getQualifiedNameType(*SS, T);
return T.getAsOpaquePtr();
}
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=67268&r1=67267&r2=67268&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Mar 18 19:39:20 2009
@@ -765,6 +765,9 @@
&TemplateArgs[0],
TemplateArgs.size(),
RAngleLoc);
+
+ if (SS)
+ Result = getQualifiedNameType(*SS, Result);
TemplateArgsIn.release();
return Result.getAsOpaquePtr();
@@ -1910,11 +1913,12 @@
// actually wrote the specialization, rather than formatting the
// name based on the "canonical" representation used to store the
// template arguments in the specialization.
- Specialization->setTypeAsWritten(
- Context.getClassTemplateSpecializationType(ClassTemplate,
- &TemplateArgs[0],
- TemplateArgs.size(),
- Context.getTypeDeclType(Specialization)));
+ QualType WrittenTy
+ = Context.getClassTemplateSpecializationType(ClassTemplate,
+ &TemplateArgs[0],
+ TemplateArgs.size(),
+ Context.getTypeDeclType(Specialization));
+ Specialization->setTypeAsWritten(getQualifiedNameType(SS, WrittenTy));
TemplateArgsIn.release();
// C++ [temp.expl.spec]p9:
Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=67268&r1=67267&r2=67268&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Wed Mar 18 19:39:20 2009
@@ -1077,3 +1077,16 @@
return true;
}
+
+/// \brief Retrieve a version of the type 'T' that is qualified by the
+/// nested-name-specifier contained in SS.
+QualType Sema::getQualifiedNameType(const CXXScopeSpec &SS, QualType T) {
+ if (!SS.isSet() || SS.isInvalid() || T.isNull())
+ return T;
+
+ llvm::SmallVector<NestedNameSpecifier, 4> Specs;
+ for (CXXScopeSpec::iterator Spec = SS.begin(), SpecEnd = SS.end();
+ Spec != SpecEnd; ++Spec)
+ Specs.push_back(NestedNameSpecifier::getFromOpaquePtr(*Spec));
+ return Context.getQualifiedNameType(&Specs[0], Specs.size(), T);
+}
Modified: cfe/trunk/test/SemaCXX/qualified-names-diag.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/qualified-names-diag.cpp?rev=67268&r1=67267&r2=67268&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/qualified-names-diag.cpp (original)
+++ cfe/trunk/test/SemaCXX/qualified-names-diag.cpp Wed Mar 18 19:39:20 2009
@@ -15,6 +15,8 @@
namespace bar {
typedef int y;
+
+ struct incomplete; // expected-note{{forward declaration of 'struct incomplete'}}
}
void test() {
foo::wibble::x a;
@@ -23,6 +25,9 @@
::foo::wibble::bar::wonka::x::y c;
c + b; // expected-error{{invalid operands to binary expression ('::foo::wibble::bar::wonka::x::y' (aka 'struct y') and '::bar::y' (aka 'int'))}}
+
+ (void)sizeof(bar::incomplete); // expected-error{{invalid application of 'sizeof' to an incomplete type 'bar::incomplete' (aka 'struct incomplete')}}
}
int ::foo::wibble::bar::wonka::x::y::* ptrmem;
+
Added: cfe/trunk/test/SemaTemplate/qualified-names-diag.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/qualified-names-diag.cpp?rev=67268&view=auto
==============================================================================
--- cfe/trunk/test/SemaTemplate/qualified-names-diag.cpp (added)
+++ cfe/trunk/test/SemaTemplate/qualified-names-diag.cpp Wed Mar 18 19:39:20 2009
@@ -0,0 +1,16 @@
+// RUN: clang -fsyntax-only -verify %s
+
+namespace std {
+ template<typename T> class vector { };
+}
+
+typedef int INT;
+typedef float Real;
+
+void test() {
+ using namespace std;
+
+ std::vector<INT> v1;
+ vector<Real> v2;
+ v1 = v2; // expected-error{{incompatible type assigning 'vector<Real>' (aka 'class vector<float>'), expected 'std::vector<INT>' (aka 'class vector<int>')}}
+}
More information about the cfe-commits
mailing list