HI Douglas, I would normally wait for your review on this, but it seemed fairly safe and fixed a buildbot broken by the previous patch fixing one line extern C declarations.
Let me know if you are OK with this patch. On 25 April 2013 21:30, Rafael Espindola <[email protected]> wrote: > Author: rafael > Date: Thu Apr 25 20:30:23 2013 > New Revision: 180591 > > URL: http://llvm.org/viewvc/llvm-project?rev=180591&view=rev > Log: > Add r180263 back, but fix hasBraces() to be correct during parsing. > > Original commit message: > > Fix a case in linkage computation that should check for single line extern > "C". > > Modified: > cfe/trunk/include/clang/AST/DeclCXX.h > cfe/trunk/lib/AST/Decl.cpp > cfe/trunk/lib/AST/DeclCXX.cpp > cfe/trunk/lib/Sema/SemaDeclCXX.cpp > cfe/trunk/test/SemaCXX/undefined-internal.cpp > > Modified: cfe/trunk/include/clang/AST/DeclCXX.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=180591&r1=180590&r2=180591&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/DeclCXX.h (original) > +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Apr 25 20:30:23 2013 > @@ -2352,22 +2352,27 @@ public: > private: > /// Language - The language for this linkage specification. > LanguageIDs Language; > + /// True if this linkage spec has brances. This is needed so that > hasBraces() > + /// returns the correct result while the linkage spec body is being parsed. > + /// Once RBraceLoc has been set this is not used, so it doesn't need to be > + /// serialized. > + bool HasBraces; > /// ExternLoc - The source location for the extern keyword. > SourceLocation ExternLoc; > /// RBraceLoc - The source location for the right brace (if valid). > SourceLocation RBraceLoc; > > LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc, > - SourceLocation LangLoc, LanguageIDs lang, > - SourceLocation RBLoc) > + SourceLocation LangLoc, LanguageIDs lang, bool HasBraces) > : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec), > - Language(lang), ExternLoc(ExternLoc), RBraceLoc(RBLoc) { } > + Language(lang), HasBraces(HasBraces), ExternLoc(ExternLoc), > + RBraceLoc(SourceLocation()) { } > > public: > static LinkageSpecDecl *Create(ASTContext &C, DeclContext *DC, > SourceLocation ExternLoc, > SourceLocation LangLoc, LanguageIDs Lang, > - SourceLocation RBraceLoc = > SourceLocation()); > + bool HasBraces); > static LinkageSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID); > > /// \brief Return the language specified by this linkage specification. > @@ -2377,12 +2382,18 @@ public: > > /// \brief Determines whether this linkage specification had braces in > /// its syntactic form. > - bool hasBraces() const { return RBraceLoc.isValid(); } > + bool hasBraces() const { > + assert(!RBraceLoc.isValid() || HasBraces); > + return HasBraces; > + } > > SourceLocation getExternLoc() const { return ExternLoc; } > SourceLocation getRBraceLoc() const { return RBraceLoc; } > void setExternLoc(SourceLocation L) { ExternLoc = L; } > - void setRBraceLoc(SourceLocation L) { RBraceLoc = L; } > + void setRBraceLoc(SourceLocation L) { > + RBraceLoc = L; > + HasBraces = RBraceLoc.isValid(); > + } > > SourceLocation getLocEnd() const LLVM_READONLY { > if (hasBraces()) > > Modified: cfe/trunk/lib/AST/Decl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=180591&r1=180590&r2=180591&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/Decl.cpp (original) > +++ cfe/trunk/lib/AST/Decl.cpp Thu Apr 25 20:30:23 2013 > @@ -476,6 +476,13 @@ template <typename T> static bool isInEx > return First->getDeclContext()->isExternCContext(); > } > > +static bool isSingleLineExternC(const Decl &D) { > + if (const LinkageSpecDecl *SD = > dyn_cast<LinkageSpecDecl>(D.getDeclContext())) > + if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces()) > + return true; > + return false; > +} > + > static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, > LVComputationKind computation) > { > assert(D->getDeclContext()->getRedeclContext()->isFileContext() && > @@ -504,7 +511,8 @@ static LinkageInfo getLVForNamespaceScop > return PrevVar->getLinkageAndVisibility(); > > if (Var->getStorageClass() != SC_Extern && > - Var->getStorageClass() != SC_PrivateExtern) > + Var->getStorageClass() != SC_PrivateExtern && > + !isSingleLineExternC(*Var)) > return LinkageInfo::internal(); > } > > @@ -1580,11 +1588,8 @@ VarDecl::DefinitionKind VarDecl::isThisD > // A declaration directly contained in a linkage-specification is treated > // as if it contains the extern specifier for the purpose of determining > // the linkage of the declared name and whether it is a definition. > - const DeclContext *DC = getDeclContext(); > - if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(DC)) { > - if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces()) > - return DeclarationOnly; > - } > + if (isSingleLineExternC(*this)) > + return DeclarationOnly; > > // C99 6.9.2p2: > // A declaration of an object that has file scope without an initializer, > > Modified: cfe/trunk/lib/AST/DeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/DeclCXX.cpp (original) > +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Apr 25 20:30:23 2013 > @@ -1816,14 +1816,14 @@ LinkageSpecDecl *LinkageSpecDecl::Create > SourceLocation ExternLoc, > SourceLocation LangLoc, > LanguageIDs Lang, > - SourceLocation RBraceLoc) { > - return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc); > + bool HasBraces) { > + return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces); > } > > LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned > ID) { > void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl)); > return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(), > - lang_c, SourceLocation()); > + lang_c, false); > } > > void UsingDirectiveDecl::anchor() { } > > Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Apr 25 20:30:23 2013 > @@ -10507,7 +10507,8 @@ Decl *Sema::ActOnStartLinkageSpecificati > // FIXME: Add all the various semantics of linkage specifications > > LinkageSpecDecl *D = LinkageSpecDecl::Create(Context, CurContext, > - ExternLoc, LangLoc, Language); > + ExternLoc, LangLoc, Language, > + LBraceLoc.isValid()); > CurContext->addDecl(D); > PushDeclContext(S, D); > return D; > > Modified: cfe/trunk/test/SemaCXX/undefined-internal.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/undefined-internal.cpp?rev=180591&r1=180590&r2=180591&view=diff > ============================================================================== > --- cfe/trunk/test/SemaCXX/undefined-internal.cpp (original) > +++ cfe/trunk/test/SemaCXX/undefined-internal.cpp Thu Apr 25 20:30:23 2013 > @@ -323,3 +323,10 @@ namespace test13 { > } > } > > +namespace test14 { > + extern "C" const int foo; > + > + int f() { > + return foo; > + } > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
